From e8f60ebdd0f62a55ac4bf3874ccebb438346b818 Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Thu, 23 Jun 2016 11:40:10 +0900 Subject: [PATCH] Add server_ack & resource_not_available command and init command in preload enabled Change-Id: I73dc1a23c4ed2bdd9017a9d7761f2868889a3ae4 --- include/muse_core.h | 2 ++ src/muse_core.c | 14 +++++++++----- src/muse_core_ipc.c | 21 ++++++++++++++++++--- src/muse_core_server.c | 10 ++++++++-- src/muse_core_workqueue.c | 5 ++++- 5 files changed, 41 insertions(+), 11 deletions(-) diff --git a/include/muse_core.h b/include/muse_core.h index d7e6993..a6a6c9a 100644 --- a/include/muse_core.h +++ b/include/muse_core.h @@ -36,6 +36,8 @@ typedef enum { MUSE_MODULE_COMMAND_INITIALIZE = 0, MUSE_MODULE_COMMAND_SHUTDOWN, MUSE_MODULE_COMMAND_DEBUG_INFO_DUMP, + MUSE_MODULE_COMMAND_CREATE_SERVER_ACK, + MUSE_MODULE_COMMAND_RESOURCE_NOT_AVAILABLE, MUSE_MODULE_COMMAND_MAX } muse_module_command_e; diff --git a/src/muse_core.c b/src/muse_core.c index f353d45..b53d9a0 100644 --- a/src/muse_core.c +++ b/src/muse_core.c @@ -441,14 +441,18 @@ int muse_core_run() void muse_core_cmd_dispatch(muse_module_h module, muse_module_command_e cmd) { - muse_module_cmd_dispatchfunc *cmd_dispatcher = NULL; + muse_module_cmd_dispatchfunc cmd_dispatcher[MUSE_MODULE_COMMAND_MAX]; + int idx; - g_return_if_fail(module->ch[MUSE_CHANNEL_MSG].dll_handle != NULL); + for (idx = 0; idx < MUSE_MODULE_COMMAND_MAX; idx++) + cmd_dispatcher[idx] = NULL; - g_module_symbol(module->ch[MUSE_CHANNEL_MSG].dll_handle, CMD_DISPATCHER, (gpointer *)&cmd_dispatcher); + g_return_if_fail(module->ch[MUSE_CHANNEL_MSG].dll_handle != NULL); - if (cmd_dispatcher && cmd_dispatcher[cmd]) - cmd_dispatcher[cmd](module); + if (g_module_symbol(module->ch[MUSE_CHANNEL_MSG].dll_handle, CMD_DISPATCHER, (gpointer *)&cmd_dispatcher) == TRUE) { + if (cmd_dispatcher[cmd]) + cmd_dispatcher[cmd](module); + } } int muse_core_client_new(void) diff --git a/src/muse_core_ipc.c b/src/muse_core_ipc.c index 3eb08b2..0de7c5c 100644 --- a/src/muse_core_ipc.c +++ b/src/muse_core_ipc.c @@ -108,10 +108,12 @@ static gpointer _muse_core_ipc_dispatch_worker(gpointer data) switch (cmd) { module->disp_api = cmd; case API_CREATE: + LOGD("CREATE"); if (muse_core_msg_json_deserialize(MUSE_MODULE, module->recvMsg + module->msg_offset, &parse_len, &api_module, &err, MUSE_TYPE_INT)) { 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); + 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); @@ -374,6 +376,8 @@ gboolean muse_core_ipc_job_function(muse_core_workqueue_job_t *job) LOGD("Enter"); muse_module_h module = NULL; muse_client_h client = NULL; + GError *error = NULL; + char fd_name[MAX_ERROR_MSG_LEN]; g_return_val_if_fail(job != NULL, FALSE); @@ -387,10 +391,16 @@ gboolean muse_core_ipc_job_function(muse_core_workqueue_job_t *job) _muse_core_ipc_client_new(module->ch[MUSE_CHANNEL_MSG].fd, client); - module->ch[MUSE_CHANNEL_MSG].p_gthread = g_thread_new(NULL, _muse_core_ipc_dispatch_worker, (gpointer)module); - g_return_val_if_fail(module->ch[MUSE_CHANNEL_MSG].p_gthread != NULL, FALSE); + snprintf(fd_name, sizeof(fd_name), "fd_%d", module->ch[MUSE_CHANNEL_MSG].fd); + module->ch[MUSE_CHANNEL_MSG].p_gthread = g_thread_try_new(fd_name, _muse_core_ipc_dispatch_worker, (gpointer)module, &error); + if (module->ch[MUSE_CHANNEL_MSG].p_gthread == NULL && error) { + LOGE("%s %s", fd_name, error->message); + module->ch[MUSE_CHANNEL_MSG].dll_handle = muse_core_module_get_instance()->load(API_CREATE); + muse_core_cmd_dispatch(module, MUSE_MODULE_COMMAND_RESOURCE_NOT_AVAILABLE); + } MUSE_FREE(job); + g_return_val_if_fail(module->ch[MUSE_CHANNEL_MSG].p_gthread != NULL, FALSE); LOGD("Leave"); return TRUE; @@ -400,6 +410,9 @@ gboolean muse_core_ipc_data_job_function(muse_core_workqueue_job_t *job) { LOGD("Enter"); intptr_t fd; + GError *error = NULL; + GThread *p_gthread = NULL; + char fd_name[MAX_ERROR_MSG_LEN]; g_return_val_if_fail(job != NULL, FALSE); @@ -408,9 +421,11 @@ gboolean muse_core_ipc_data_job_function(muse_core_workqueue_job_t *job) LOGD("data channel fd : %d", fd); - g_thread_new(NULL, _muse_core_ipc_data_worker, (gpointer)fd); + snprintf(fd_name, sizeof(fd_name), "fd_%d", fd); + p_gthread = g_thread_try_new(fd_name, _muse_core_ipc_data_worker, GINT_TO_POINTER(fd), &error); MUSE_FREE(job); + g_return_val_if_fail(p_gthread != NULL, FALSE); LOGD("Leave"); return TRUE; diff --git a/src/muse_core_server.c b/src/muse_core_server.c index 13c3785..fed61c1 100644 --- a/src/muse_core_server.c +++ b/src/muse_core_server.c @@ -97,8 +97,14 @@ int main(int argc, char **argv) muse_core_tool_parse_params(argc, argv); for (index = 0; index < muse_core_config_get_instance()->get_host_cnt(); index++) { - if (0 == strcmp(muse_core_config_get_instance()->get_preloaded(index), "yes")) - muse_core_module_get_instance()->load(index); + if (0 == strcmp(muse_core_config_get_instance()->get_preloaded(index), "yes")) { + muse_module_h module = NULL; + muse_module_cmd_dispatchfunc *cmd_dispatcher = NULL; + + g_module_symbol(muse_core_module_get_instance()->load(index), CMD_DISPATCHER, (gpointer *)&cmd_dispatcher); + if (cmd_dispatcher && cmd_dispatcher[MUSE_MODULE_COMMAND_INITIALIZE]) + cmd_dispatcher[MUSE_MODULE_COMMAND_INITIALIZE](module); + } } if (muse_core_security_get_instance()->new() < 0) { diff --git a/src/muse_core_workqueue.c b/src/muse_core_workqueue.c index a8ac033..4761185 100644 --- a/src/muse_core_workqueue.c +++ b/src/muse_core_workqueue.c @@ -58,7 +58,10 @@ static void *_muse_core_workqueue_worker_function(void *ptr) continue; /* Execute the job. */ - job->job_function(job); + if (job->job_function(job) != TRUE) { + LOGE("Error - Execute the job"); + break; + } } MUSE_FREE(worker); -- 2.7.4