fix: properly releasing C memory to avoid double-freeing

dev_1
Gordon 2 years ago committed by Gordon
parent c4f4d0422c
commit 314328c002
  1. 18
      c_wrapper/export.go
  2. 30
      c_wrapper/protocol.go
  3. 7
      c_wrapper/test.c

@ -294,40 +294,40 @@ func NewUserCallback(cCallback C.CB_I_S) *UserCallback {
type SendMessageCallback struct { type SendMessageCallback struct {
cCallback C.CB_S_I_S_S_I cCallback C.CB_S_I_S_S_I
operationID *C.char operationID string
} }
func NewSendMessageCallback(cCallback C.CB_S_I_S_S_I, operationID *C.char) *SendMessageCallback { func NewSendMessageCallback(cCallback C.CB_S_I_S_S_I, operationID *C.char) *SendMessageCallback {
return &SendMessageCallback{cCallback: cCallback, operationID: operationID} return &SendMessageCallback{cCallback: cCallback, operationID: C.GoString(operationID)}
} }
func (s SendMessageCallback) OnError(errCode int32, errMsg string) { func (s SendMessageCallback) OnError(errCode int32, errMsg string) {
C.Call_CB_S_I_S_S_I(s.cCallback, s.operationID, C.int(errCode), C.CString(errMsg), NO_DATA, NO_PROGRESS) C.Call_CB_S_I_S_S_I(s.cCallback, C.CString(s.operationID), C.int(errCode), C.CString(errMsg), NO_DATA, NO_PROGRESS)
} }
func (s SendMessageCallback) OnSuccess(data string) { func (s SendMessageCallback) OnSuccess(data string) {
C.Call_CB_S_I_S_S_I(s.cCallback, s.operationID, NO_ERR, NO_ERR_MSG, C.CString(data), NO_PROGRESS) C.Call_CB_S_I_S_S_I(s.cCallback, C.CString(s.operationID), NO_ERR, NO_ERR_MSG, C.CString(data), NO_PROGRESS)
} }
func (s SendMessageCallback) OnProgress(progress int) { func (s SendMessageCallback) OnProgress(progress int) {
C.Call_CB_S_I_S_S_I(s.cCallback, s.operationID, NO_ERR, NO_ERR_MSG, NO_DATA, C.int(progress)) C.Call_CB_S_I_S_S_I(s.cCallback, C.CString(s.operationID), NO_ERR, NO_ERR_MSG, NO_DATA, C.int(progress))
} }
type BaseCallback struct { type BaseCallback struct {
cCallback C.CB_S_I_S_S cCallback C.CB_S_I_S_S
operationID *C.char operationID string
} }
func NewBaseCallback(cCallback C.CB_S_I_S_S, operationID *C.char) *BaseCallback { func NewBaseCallback(cCallback C.CB_S_I_S_S, operationID *C.char) *BaseCallback {
return &BaseCallback{cCallback: cCallback, operationID: operationID} return &BaseCallback{cCallback: cCallback, operationID: C.GoString(operationID)}
} }
func (b BaseCallback) OnError(errCode int32, errMsg string) { func (b BaseCallback) OnError(errCode int32, errMsg string) {
C.Call_CB_S_I_S_S(b.cCallback, b.operationID, C.int(errCode), C.CString(errMsg), NO_DATA) C.Call_CB_S_I_S_S(b.cCallback, C.CString(b.operationID), C.int(errCode), C.CString(errMsg), NO_DATA)
} }
func (b BaseCallback) OnSuccess(data string) { func (b BaseCallback) OnSuccess(data string) {
C.Call_CB_S_I_S_S(b.cCallback, b.operationID, NO_ERR, NO_ERR_MSG, C.CString(data)) C.Call_CB_S_I_S_S(b.cCallback, C.CString(b.operationID), NO_ERR, NO_ERR_MSG, C.CString(data))
} }
// =====================================================global_callback=============================================== // =====================================================global_callback===============================================

@ -10,19 +10,49 @@ typedef void (*CB_S_I_S_S_I)(char *,int,char *,char *,int);
void Call_CB_I_S(CB_I_S func,int event,char* data) void Call_CB_I_S(CB_I_S func,int event,char* data)
{ {
func(event,data); func(event,data);
if (data != NULL && data[0] != '\0')
{
printf("this is not null data event\n");
free(data); free(data);
} }
}
void Call_CB_S_I_S_S(CB_S_I_S_S func,char* operationID, int errCode,char* errMsg,char* data) void Call_CB_S_I_S_S(CB_S_I_S_S func,char* operationID, int errCode,char* errMsg,char* data)
{ {
func(operationID,errCode,errMsg,data); func(operationID,errCode,errMsg,data);
if (errMsg != NULL && errMsg[0] != '\0')
{
printf("this is not null errmsg\n");
free(errMsg); free(errMsg);
}
if (data != NULL && data[0] != '\0')
{
printf("this is not null data base,opid:%s,data:%s\n",operationID,data);
free(data); free(data);
} }
if (operationID != NULL)
{
printf("this is not null operationID:%s\n",operationID);
free(operationID);
}
}
void Call_CB_S_I_S_S_I(CB_S_I_S_S_I func,char* operationID,int errCode,char* errMsg,char* data,int progress) void Call_CB_S_I_S_S_I(CB_S_I_S_S_I func,char* operationID,int errCode,char* errMsg,char* data,int progress)
{ {
func(operationID,errCode,errMsg,data,progress); func(operationID,errCode,errMsg,data,progress);
if (errMsg != NULL && errMsg[0] != '\0')
{
printf("this is not null errmsg\n");
free(errMsg); free(errMsg);
}
if (data != NULL && data[0] != '\0')
{
printf("this is not null data\n");
free(data); free(data);
}
if (operationID != NULL)
{
printf("this is not null operationID\n");
free(operationID);
}
} }
enum CONN_EVENT{ enum CONN_EVENT{
CONNECTING, CONNECTING,

@ -46,10 +46,11 @@ int main(int argc, char **argv)
char* loginUserID=get_login_user(); char* loginUserID=get_login_user();
printf("return :%s\n",loginUserID); printf("return :%s\n",loginUserID);
char operationID1[] = "12345,create";
char* message = create_text_message(operationID,"哈哈"); char *message = create_text_message(operationID1, "哈哈");
printf("return :%s\n",message); printf("return :%s\n",message);
get_all_conversation_list(c_base_callback,operationID); char operationID2[] = "12345,get_all_conversation_list";
get_all_conversation_list(c_base_callback, operationID2);
sleep(1000000); sleep(1000000);
return 0; return 0;

Loading…
Cancel
Save