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;
#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);
}
}