[0.1.29] add handling about multiple msg 95/96495/1
authorEunhae Choi <eunhae1.choi@samsung.com>
Mon, 7 Nov 2016 05:54:28 +0000 (14:54 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Wed, 9 Nov 2016 07:11:26 +0000 (16:11 +0900)
Change-Id: I8fe291a4b42f1b0b810c3ad6539e61e0c50422bf

packaging/mused.spec
src/muse_core_ipc.c

index 1326ca3..07ab3c9 100644 (file)
@@ -1,6 +1,6 @@
 Name:       mused
 Summary:    A Multimedia Daemon in Tizen Native API
-Version:    0.1.28
+Version:    0.1.29
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0
index 1c7b8c6..07bfd9c 100644 (file)
@@ -99,6 +99,7 @@ static void _muse_core_ipc_client_cleanup(muse_module_h module)
 static gpointer _muse_core_ipc_dispatch_worker(gpointer data)
 {
        int len, cmd, api_module;
+       int parse_len = 0;
        muse_module_h module = NULL;
        gboolean value = TRUE;
        void *jobj = NULL;
@@ -126,72 +127,77 @@ static gpointer _muse_core_ipc_dispatch_worker(gpointer data)
 #ifndef MUSE_NO_LOG
                        muse_core_log_get_instance()->log(module->recvMsg);
 #endif
-                       jobj = muse_core_msg_json_object_new(module->recvMsg, &len, NULL);
-                       if (jobj == NULL) {
-                               LOGE("jobj is null");
-                               break;
-                       }
+                       while (module->msg_offset < len) {
 
-                       if (muse_core_msg_json_object_get_value(MUSE_API, jobj, &cmd, MUSE_TYPE_INT) ==TRUE) {
-                               switch (cmd) {
-                               module->disp_api = cmd;
-                               case API_CREATE:
-                                       LOGD("CREATE ### %p", module);
-                                       pthread_mutex_lock(&muse_core_workqueue_get_instance()->jobs_mutex);
-                                       if (muse_core_msg_json_object_get_value(MUSE_MODULE, jobj, &api_module, MUSE_TYPE_INT) == TRUE) {
-                                               module->api_module = api_module;
-                                               module->is_create_api_called = true;
-                                               module->ch[MUSE_CHANNEL_MSG].dll_handle = muse_core_module_get_instance()->load(api_module);
-                                               if (access(MUSE_SERVER_READY, F_OK) == 0)
-                                                       muse_core_cmd_dispatch(module, MUSE_MODULE_COMMAND_CREATE_SERVER_ACK);
-                                               module->ch[MUSE_CHANNEL_DATA].queue = g_queue_new();
-                                               g_mutex_init(&module->ch[MUSE_CHANNEL_DATA].mutex);
-                                               LOGD("module fd: %d dll_handle: %p", module->ch[MUSE_CHANNEL_MSG].fd, module->ch[MUSE_CHANNEL_MSG].dll_handle);
-                                               muse_core_module_get_instance()->dispatch(cmd, module);
-                                       }
-                                       pthread_mutex_unlock(&muse_core_workqueue_get_instance()->jobs_mutex);
-                                       break;
-                               case API_DESTROY:
-                                       LOGD("DESTROY ### %p", module);
-                                       muse_core_module_get_instance()->dispatch(cmd, module);
-                                       _muse_core_ipc_client_cleanup(module);
+                               jobj = muse_core_msg_json_object_new(module->recvMsg+module->msg_offset, &parse_len, NULL);
+                               if (jobj == NULL) {
+                                       LOGE("jobj is null");
                                        break;
-                               default:
-                                       module->ch[MUSE_CHANNEL_MSG].tbm_fd = tbm_fd[0];
-
-                                       if (module->is_create_api_called == false) {
+                               }
 
+                               if (muse_core_msg_json_object_get_value(MUSE_API, jobj, &cmd, MUSE_TYPE_INT) ==TRUE) {
+                                       switch (cmd) {
+                                       module->disp_api = cmd;
+                                       case API_CREATE:
+                                               LOGD("CREATE ### %p", module);
                                                pthread_mutex_lock(&muse_core_workqueue_get_instance()->jobs_mutex);
-
                                                if (muse_core_msg_json_object_get_value(MUSE_MODULE, jobj, &api_module, MUSE_TYPE_INT) == TRUE) {
                                                        module->api_module = api_module;
+                                                       module->is_create_api_called = true;
+                                                       module->ch[MUSE_CHANNEL_MSG].dll_handle = muse_core_module_get_instance()->load(api_module);
+                                                       if (access(MUSE_SERVER_READY, F_OK) == 0)
+                                                               muse_core_cmd_dispatch(module, MUSE_MODULE_COMMAND_CREATE_SERVER_ACK);
                                                        module->ch[MUSE_CHANNEL_DATA].queue = g_queue_new();
                                                        g_mutex_init(&module->ch[MUSE_CHANNEL_DATA].mutex);
+                                                       LOGD("module fd: %d dll_handle: %p", module->ch[MUSE_CHANNEL_MSG].fd, module->ch[MUSE_CHANNEL_MSG].dll_handle);
+                                                       muse_core_module_get_instance()->dispatch(cmd, module);
+                                               }
+                                               pthread_mutex_unlock(&muse_core_workqueue_get_instance()->jobs_mutex);
+                                               break;
+                                       case API_DESTROY:
+                                               LOGD("DESTROY ### %p", module);
+                                               muse_core_module_get_instance()->dispatch(cmd, module);
+                                               _muse_core_ipc_client_cleanup(module);
+                                               break;
+                                       default:
+                                               module->ch[MUSE_CHANNEL_MSG].tbm_fd = tbm_fd[0];
 
-                                                       value = muse_core_module_get_instance()->get_dllsymbol_loaded_value(api_module);
+                                               if (module->is_create_api_called == false) {
 
-                                                       module->ch[MUSE_CHANNEL_MSG].dll_handle = muse_core_module_get_instance()->load(api_module);
-                                               }
-                                       }
+                                                       pthread_mutex_lock(&muse_core_workqueue_get_instance()->jobs_mutex);
 
-                                       muse_core_module_get_instance()->dispatch(cmd, module);
+                                                       if (muse_core_msg_json_object_get_value(MUSE_MODULE, jobj, &api_module, MUSE_TYPE_INT) == TRUE) {
+                                                               module->api_module = api_module;
+                                                               module->ch[MUSE_CHANNEL_DATA].queue = g_queue_new();
+                                                               g_mutex_init(&module->ch[MUSE_CHANNEL_DATA].mutex);
 
-                                       if (module->is_create_api_called == false) {
-                                               LOGW("_muse_core_ipc_client_cleanup [module %p] [get_dllsymbol_loaded_value %d]", module, value);
+                                                               value = muse_core_module_get_instance()->get_dllsymbol_loaded_value(api_module);
 
-                                               if (!value) {
-                                                       LOGW("release module dll handle");
-                                                       muse_core_module_get_instance()->close(module);
+                                                               module->ch[MUSE_CHANNEL_MSG].dll_handle = muse_core_module_get_instance()->load(api_module);
+                                                       }
                                                }
 
-                                               pthread_mutex_unlock(&muse_core_workqueue_get_instance()->jobs_mutex);
+                                               muse_core_module_get_instance()->dispatch(cmd, module);
 
-                                               _muse_core_ipc_client_cleanup(module);
+                                               if (module->is_create_api_called == false) {
+                                                       LOGW("_muse_core_ipc_client_cleanup [module %p] [get_dllsymbol_loaded_value %d]", module, value);
+
+                                                       if (!value) {
+                                                               LOGW("release module dll handle");
+                                                               muse_core_module_get_instance()->close(module);
+                                                       }
+
+                                                       pthread_mutex_unlock(&muse_core_workqueue_get_instance()->jobs_mutex);
+
+                                                       _muse_core_ipc_client_cleanup(module);
+                                               }
+                                               break;
                                        }
-                                       break;
                                }
+                               muse_core_msg_json_object_free(jobj);
+                               module->msg_offset += parse_len;
+                               parse_len = len - parse_len;
                        }
-                       muse_core_msg_json_object_free(jobj);
                }
        }