From 388bed6c2abd0ba02a9ea666b3495f30061e4f70 Mon Sep 17 00:00:00 2001 From: Eunhae Choi Date: Mon, 7 Nov 2016 14:54:28 +0900 Subject: [PATCH] [0.1.29] add handling about multiple msg Change-Id: I8fe291a4b42f1b0b810c3ad6539e61e0c50422bf --- packaging/mused.spec | 2 +- src/muse_core_ipc.c | 100 +++++++++++++++++++++++++++------------------------ 2 files changed, 54 insertions(+), 48 deletions(-) diff --git a/packaging/mused.spec b/packaging/mused.spec index 1326ca3..07ab3c9 100644 --- a/packaging/mused.spec +++ b/packaging/mused.spec @@ -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 diff --git a/src/muse_core_ipc.c b/src/muse_core_ipc.c index 1c7b8c6..07bfd9c 100644 --- a/src/muse_core_ipc.c +++ b/src/muse_core_ipc.c @@ -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); } } -- 2.7.4