Browse Source

修复cJSON内存释放的错误(cJSON_Delete误写成了cJSON_free)

slyant 5 years ago
parent
commit
46c3516c3e
2 changed files with 57 additions and 49 deletions
  1. 51 41
      examples/task_msg_bus_sample.c
  2. 6 8
      src/task_msg_bus.c

+ 51 - 41
examples/task_msg_bus_sample.c

@@ -10,60 +10,70 @@
 
 static void msg_wait_thread_entry(void *params)
 {
+    rt_err_t rst;
     struct task_msg_args args;
     while(1)
     {
         /*
         //测试 task_msg_wait_until
-        task_msg_wait_until(TASK_MSG_NET_REDAY, RT_WAITING_FOREVER, &args);
-        LOG_D("task_msg_wait_until => args.msg_name:%d, args.msg_args_json:%s", args.msg_name, args.msg_args_json);
-        rt_free(args.msg_args_json);    
+        rst = task_msg_wait_until(TASK_MSG_NET_REDAY, RT_WAITING_FOREVER, &args);
+        if(rst==RT_EOK)
+        {
+            LOG_D("task_msg_wait_until => args.msg_name:%d, args.msg_args_json:%s", args.msg_name, args.msg_args_json);
+        }
         */
 
         //测试 task_msg_wait_any
         const enum task_msg_name name_list[4] = {TASK_MSG_OS_REDAY, TASK_MSG_NET_REDAY, TASK_MSG_3, TASK_MSG_5};
-        task_msg_wait_any(name_list, sizeof(name_list)/sizeof(enum task_msg_name), RT_WAITING_FOREVER, &args);
-        LOG_D("task_msg_wait_any => args.msg_name:%d, args.msg_args_json:%s", args.msg_name, args.msg_args_json);
-    #ifdef TASK_MSG_USING_JSON
-        cJSON *root = cJSON_Parse(args.msg_args_json);
-        if(root)
+        rst = task_msg_wait_any(name_list, sizeof(name_list)/sizeof(enum task_msg_name), RT_WAITING_FOREVER, &args);
+        if(rst==RT_EOK)
         {
-            if(args.msg_name==TASK_MSG_OS_REDAY)
-            {
-                int os_reday, id;
-                if(cJSON_item_get_number(root, "os_reday", &os_reday)==0)
-                    LOG_D("TASK_MSG_OS_REDAY=>os_reday:%d", os_reday);
-                if(cJSON_item_get_number(root, "id", &id)==0)
-                    LOG_D("TASK_MSG_OS_REDAY=>id:%d", id);
-            }
-            else if(args.msg_name==TASK_MSG_NET_REDAY)
+            LOG_D("task_msg_wait_any => args.msg_name:%d, args.msg_args_json:%s", args.msg_name, args.msg_args_json);
+        #ifdef TASK_MSG_USING_JSON
+            cJSON *root = cJSON_Parse(args.msg_args_json);
+            if(root)
             {
-                int os_reday, id;
-                if(cJSON_item_get_number(root, "net_reday", &os_reday)==0)
-                    LOG_D("TASK_MSG_NET_REDAY=>net_reday:%d", os_reday);
-                const char *ip = cJSON_item_get_string(root, "ip");
-                if(ip)
-                    LOG_D("TASK_MSG_NET_REDAY=>ip:%s", ip);
-                if(cJSON_item_get_number(root, "id", &id)==0)
-                    LOG_D("TASK_MSG_NET_REDAY=>id:%d", id);
+                if(args.msg_name==TASK_MSG_OS_REDAY)
+                {
+                    int os_reday, id;
+                    if(cJSON_item_get_number(root, "os_reday", &os_reday)==0)
+                        LOG_D("TASK_MSG_OS_REDAY=>os_reday:%d", os_reday);
+                    if(cJSON_item_get_number(root, "id", &id)==0)
+                        LOG_D("TASK_MSG_OS_REDAY=>id:%d", id);
+                }
+                else if(args.msg_name==TASK_MSG_NET_REDAY)
+                {
+                    int os_reday, id;
+                    if(cJSON_item_get_number(root, "net_reday", &os_reday)==0)
+                        LOG_D("TASK_MSG_NET_REDAY=>net_reday:%d", os_reday);
+                    const char *ip = cJSON_item_get_string(root, "ip");
+                    if(ip)
+                        LOG_D("TASK_MSG_NET_REDAY=>ip:%s", ip);
+                    if(cJSON_item_get_number(root, "id", &id)==0)
+                        LOG_D("TASK_MSG_NET_REDAY=>id:%d", id);
+                }
+                else if(args.msg_name==TASK_MSG_3)
+                {
+                    int id;
+                    const char *msg_3 = cJSON_item_get_string(root, "msg_3");
+                    if(msg_3)
+                        LOG_D("TASK_MSG_3=>msg_3:%s", msg_3);
+                    const char *name = cJSON_item_get_string(root, "name");
+                    if(name)
+                        LOG_D("TASK_MSG_3=>name:%s", name);
+                    if(cJSON_item_get_number(root, "id", &id)==0)
+                        LOG_D("TASK_MSG_3=>id:%d", id);
+                }
+                cJSON_Delete(root);
             }
-            else if(args.msg_name==TASK_MSG_3)
-            {
-                int id;
-                const char *msg_3 = cJSON_item_get_string(root, "msg_3");
-                if(msg_3)
-                    LOG_D("TASK_MSG_3=>msg_3:%s", msg_3);
-                const char *name = cJSON_item_get_string(root, "name");
-                if(name)
-                    LOG_D("TASK_MSG_3=>name:%s", name);
-                if(cJSON_item_get_number(root, "id", &id)==0)
-                    LOG_D("TASK_MSG_3=>id:%d", id);
-            }
-            cJSON_free(root);
+        #endif
         }
-    #endif
+        //释放内存
         if(args.msg_args_json)
+        {
             rt_free(args.msg_args_json);
+            args.msg_args_json = RT_NULL;
+        }
     }    
 }
 
@@ -112,10 +122,10 @@ static int task_msg_bus_sample(void)
     task_msg_subscribe(TASK_MSG_NET_REDAY, net_reday_callback);
     task_msg_subscribe(TASK_MSG_OS_REDAY, os_reday_callback);
     //创建一个等待消息的线程
-    rt_thread_t t_wait = rt_thread_create("msg_wait", msg_wait_thread_entry, RT_NULL, 1024*2, 20, 10);
+    rt_thread_t t_wait = rt_thread_create("msg_wait", msg_wait_thread_entry, RT_NULL, 1024*1, 20, 10);
     rt_thread_startup(t_wait);
     //创建一个发布消息的线程
-    rt_thread_t t_publish = rt_thread_create("msg_pub", msg_publish_thread_entry, RT_NULL, 1024*2, 15, 10);
+    rt_thread_t t_publish = rt_thread_create("msg_pub", msg_publish_thread_entry, RT_NULL, 1024*1, 15, 10);
     rt_thread_startup(t_publish);
 
     return RT_EOK;

+ 6 - 8
src/task_msg_bus.c

@@ -50,9 +50,9 @@ rt_err_t task_msg_wait_any(const enum task_msg_name *msg_name_list, rt_uint8_t m
     rt_err_t rst = rt_sem_take(&(node->msg_sem), timeout);
     if(rst==RT_EOK && out_args)
     {
-        out_args->msg_name = node->msg_name;
-        out_args->msg_args_json = RT_NULL;
-        if(node->msg_args_json) out_args->msg_args_json = rt_strdup(node->msg_args_json);
+        (*out_args).msg_name = node->msg_name;
+        (*out_args).msg_args_json = RT_NULL;
+        if(node->msg_args_json) (*out_args).msg_args_json = rt_strdup(node->msg_args_json);
     }
     rt_mutex_take(&wta_lock, RT_WAITING_FOREVER);
     rt_slist_remove(&wait_any_slist, &(node->slist));
@@ -89,9 +89,9 @@ rt_err_t task_msg_wait_until(enum task_msg_name msg_name, rt_uint32_t timeout, t
     rt_err_t rst = rt_sem_take(&(node->msg_sem), timeout);
     if(rst==RT_EOK && out_args)
     {
-        out_args->msg_name = msg_name;
-        out_args->msg_args_json = RT_NULL;
-        if(node->msg_args_json) out_args->msg_args_json = rt_strdup(node->msg_args_json);
+        (*out_args).msg_name = msg_name;
+        (*out_args).msg_args_json = RT_NULL;
+        if(node->msg_args_json) (*out_args).msg_args_json = rt_strdup(node->msg_args_json);
     }
     rt_mutex_take(&wt_lock, RT_WAITING_FOREVER);
     rt_slist_remove(&wait_slist, &(node->slist));
@@ -116,7 +116,6 @@ rt_err_t task_msg_subscribe(enum task_msg_name msg_name, void(*callback)(task_ms
     }
     callback_node->callback = callback;
     rt_slist_init(&(callback_node->slist));
-
     rt_mutex_take(&cb_lock, RT_WAITING_FOREVER);
     rt_bool_t find_tag = RT_FALSE;
     task_msg_callback_node_t node;
@@ -184,7 +183,6 @@ rt_err_t task_msg_publish(enum task_msg_name msg_name, const char *args_json)
     if(args_json) msg_args->msg_args_json = rt_strdup(args_json);
     node->args = msg_args;
     rt_slist_init(&(node->slist));
-
     rt_mutex_take(&msg_lock, RT_WAITING_FOREVER);
     rt_slist_append(&msg_slist, &(node->slist));
     rt_mutex_release(&msg_lock);