From bf69ab42577ce053d0a8f79b523db155c20903c9 Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Thu, 24 May 2018 08:52:29 +0900 Subject: [PATCH 01/16] Update the g_thread_try_new by resource issue Change-Id: Ib35de6f9c6cbf2f5401b24246616fb0a2a86c862 --- packaging/mm-resource-manager.spec | 2 +- src/lib/mm_resource_manager.h | 1 + src/lib/mm_resource_manager_priv.c | 12 +++++++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packaging/mm-resource-manager.spec b/packaging/mm-resource-manager.spec index 083c92d..168737d 100644 --- a/packaging/mm-resource-manager.spec +++ b/packaging/mm-resource-manager.spec @@ -1,6 +1,6 @@ Name: mm-resource-manager Summary: A Multimedia Resource Manager API -Version: 0.2.5 +Version: 0.2.6 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/lib/mm_resource_manager.h b/src/lib/mm_resource_manager.h index 34bc8f4..964dabf 100644 --- a/src/lib/mm_resource_manager.h +++ b/src/lib/mm_resource_manager.h @@ -216,6 +216,7 @@ typedef int (*mm_resource_manager_release_cb) (mm_resource_manager_h rm, * @retval #MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter * @retval #MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION Invalid operation * @retval #MM_RESOURCE_MANAGER_ERROR_INVALID_STATE Invalid state + * @retval #MM_RESOURCE_MANAGER_ERROR_NOT_ENOUGH not enough free resource volume * @see mm_resource_manager_destroy() * @see mm_resource_manager_app_class_e * @see mm_resource_manager_release_cb diff --git a/src/lib/mm_resource_manager_priv.c b/src/lib/mm_resource_manager_priv.c index 2d7c039..db87af5 100644 --- a/src/lib/mm_resource_manager_priv.c +++ b/src/lib/mm_resource_manager_priv.c @@ -130,6 +130,7 @@ int _mm_resource_manager_create(mm_resource_manager_app_class_e app_class, { mm_resource_manager_s *handle = *rm = NULL; int ret; + GError *error = NULL; handle = (mm_resource_manager_s *) calloc(1, sizeof(mm_resource_manager_s)); MM_RM_RETVM_IF(NULL == handle, MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION, @@ -146,7 +147,16 @@ int _mm_resource_manager_create(mm_resource_manager_app_class_e app_class, return ret; } - handle->dispatcher_thread = g_thread_new(NULL, __dispatcher_thread, handle); + handle->dispatcher_thread = g_thread_try_new(NULL, __dispatcher_thread, handle, &error); + if (!handle->dispatcher_thread) { + if (error) { + MM_RM_ERROR("dispatcher_thread creation failed : %s", error->message); + g_error_free(error); + } + __destroy_dispatcher(handle); + free(handle); + return MM_RESOURCE_MANAGER_ERROR_NOT_ENOUGH; + } ret = __dbus_init_conf(handle); if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { -- 2.7.4 From 59245310487c2a57885b630ca3d5b8cee10fea48 Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Fri, 15 Jun 2018 10:58:29 +0900 Subject: [PATCH 02/16] Setting variable to NULL after free Change-Id: Id901205c8f1b16c1bfcd57c607248c6ff67ebbf3 --- src/daemon/mm_resource_manager_daemon.c | 2 +- src/lib/mm_resource_manager_priv.c | 43 ++++++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/daemon/mm_resource_manager_daemon.c b/src/daemon/mm_resource_manager_daemon.c index a77827b..5232e4c 100644 --- a/src/daemon/mm_resource_manager_daemon.c +++ b/src/daemon/mm_resource_manager_daemon.c @@ -122,7 +122,7 @@ static void daemon_loop() main_loop = g_main_loop_new(NULL, FALSE); MM_RM_RETM_IF(main_loop == NULL, "Daemon cannot create main loop"); - MM_RM_INFO("Daemon loop is ran"); + MM_RM_INFO("Daemon loop [%p] is ran", main_loop); g_main_loop_run(main_loop); MM_RM_INFO("Daemon loop end"); diff --git a/src/lib/mm_resource_manager_priv.c b/src/lib/mm_resource_manager_priv.c index db87af5..cc7b448 100644 --- a/src/lib/mm_resource_manager_priv.c +++ b/src/lib/mm_resource_manager_priv.c @@ -137,7 +137,21 @@ int _mm_resource_manager_create(mm_resource_manager_app_class_e app_class, "Error allocating memory for Handle"); handle->dispatcher_context = g_main_context_new(); + if (!handle->dispatcher_context) { + free(handle); + MM_RM_ERROR("g_main_context_new failed"); + return MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION; + } + MM_RM_INFO("new main context %p", handle->dispatcher_context); + handle->dispatcher_loop = g_main_loop_new(handle->dispatcher_context, FALSE); + if (!handle->dispatcher_loop) { + g_main_context_unref(handle->dispatcher_context); + free(handle); + MM_RM_ERROR("g_main_loop_new failed"); + return MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION; + } + MM_RM_INFO("new main loop %p", handle->dispatcher_loop); ret = __dbus_init(handle); if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { @@ -147,7 +161,7 @@ int _mm_resource_manager_create(mm_resource_manager_app_class_e app_class, return ret; } - handle->dispatcher_thread = g_thread_try_new(NULL, __dispatcher_thread, handle, &error); + handle->dispatcher_thread = g_thread_try_new("dispatcher_thread", __dispatcher_thread, handle, &error); if (!handle->dispatcher_thread) { if (error) { MM_RM_ERROR("dispatcher_thread creation failed : %s", error->message); @@ -157,6 +171,7 @@ int _mm_resource_manager_create(mm_resource_manager_app_class_e app_class, free(handle); return MM_RESOURCE_MANAGER_ERROR_NOT_ENOUGH; } + MM_RM_INFO("new dispatcher thread %p", handle->dispatcher_thread); ret = __dbus_init_conf(handle); if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) { @@ -662,7 +677,7 @@ static void __init_lib() static void __deinit_lib() { if (handles->len > 0) { - MM_RM_DEBUG("Handles array is not empty. It will be cleaned now."); + MM_RM_DEBUG("Handles array [%d] is not empty. It will be cleaned now.", handles->len); while (handles->len > 0) _mm_resource_manager_destroy(handles->pdata[0]); } @@ -946,6 +961,7 @@ static gpointer __dispatcher_thread(gpointer user_data) mm_resource_manager_s *handle = (mm_resource_manager_s*) user_data; g_main_loop_run(handle->dispatcher_loop); + MM_RM_INFO("main loop %p quit", handle->dispatcher_loop); return NULL; } @@ -954,8 +970,23 @@ static void __destroy_dispatcher(mm_resource_manager_s *handle) if (__dbus_deinit(handle) != MM_RESOURCE_MANAGER_ERROR_NONE) MM_RM_ERROR("Error while dbus deinitializing"); - g_main_loop_quit(handle->dispatcher_loop); - g_thread_join(handle->dispatcher_thread); - g_main_loop_unref(handle->dispatcher_loop); - g_main_context_unref(handle->dispatcher_context); + if (handle->dispatcher_loop) { + if (g_main_loop_is_running(handle->dispatcher_loop)) { + MM_RM_INFO("mainloop %p is running", handle->dispatcher_loop); + g_main_loop_quit(handle->dispatcher_loop); + } + g_main_loop_unref(handle->dispatcher_loop); + handle->dispatcher_loop = NULL; + } + + if (handle->dispatcher_thread) { + g_thread_join(handle->dispatcher_thread); + MM_RM_INFO("dispatcher thread join %p", handle->dispatcher_thread); + handle->dispatcher_thread = NULL; + } + + if (handle->dispatcher_context) { + g_main_context_unref(handle->dispatcher_context); + handle->dispatcher_context = NULL; + } } -- 2.7.4 From 2edadff002d95013a8a043a63c6ce8b49925ecba Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Fri, 15 Jun 2018 09:10:07 +0900 Subject: [PATCH 03/16] Add dbus at the boot sequence because related with dbus configuration file Change-Id: Ief3e4e10396e288b01086c0a5e97ee24fece61fd --- packaging/mm-resource-managerd.service | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/mm-resource-managerd.service b/packaging/mm-resource-managerd.service index d242e9f..94ad67e 100644 --- a/packaging/mm-resource-managerd.service +++ b/packaging/mm-resource-managerd.service @@ -1,7 +1,7 @@ [Unit] Description=Multimedia Resource Manager -Requires=murphyd.service -After=murphyd.service +Requires=murphyd.service dbus.service +After=murphyd.service dbus.service Before=muse-server.service [Service] -- 2.7.4 From c6a9f17f142fe695b42222521b7c9348640d806d Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Wed, 27 Jun 2018 19:21:21 +0900 Subject: [PATCH 04/16] Change an argument for the new dispatcher thread Change-Id: I677ea630bf323472544e9a5a65d52a0a33e0ce8b --- src/daemon/backend/murphy/mm_resource_manager_mloop.c | 5 +++++ src/lib/mm_resource_manager_priv.c | 11 +++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/daemon/backend/murphy/mm_resource_manager_mloop.c b/src/daemon/backend/murphy/mm_resource_manager_mloop.c index 51ffd10..123e7e0 100644 --- a/src/daemon/backend/murphy/mm_resource_manager_mloop.c +++ b/src/daemon/backend/murphy/mm_resource_manager_mloop.c @@ -114,6 +114,11 @@ int _mm_resource_manager_mloop_create(mm_resource_manager_mloop_s **mrp) int _mm_resource_manager_mloop_destroy(mm_resource_manager_mloop_s *mrp) { + if (mrp == NULL) { + MM_RM_ERROR("mrp is null"); + return MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER; + } + g_mutex_lock(&mrp->lock); if (mrp->mrp_loop) diff --git a/src/lib/mm_resource_manager_priv.c b/src/lib/mm_resource_manager_priv.c index cc7b448..1e8f00c 100644 --- a/src/lib/mm_resource_manager_priv.c +++ b/src/lib/mm_resource_manager_priv.c @@ -161,7 +161,7 @@ int _mm_resource_manager_create(mm_resource_manager_app_class_e app_class, return ret; } - handle->dispatcher_thread = g_thread_try_new("dispatcher_thread", __dispatcher_thread, handle, &error); + handle->dispatcher_thread = g_thread_try_new("dispatcher_thread", __dispatcher_thread, handle->dispatcher_loop, &error); if (!handle->dispatcher_thread) { if (error) { MM_RM_ERROR("dispatcher_thread creation failed : %s", error->message); @@ -958,10 +958,13 @@ static void __dbus_status_callback(MMResourceManager *object, gint arg_status) static gpointer __dispatcher_thread(gpointer user_data) { - mm_resource_manager_s *handle = (mm_resource_manager_s*) user_data; + GMainLoop *ml = (GMainLoop *) user_data; + + if (ml) { + g_main_loop_run(ml); + MM_RM_INFO("main loop %p quit", ml); + } - g_main_loop_run(handle->dispatcher_loop); - MM_RM_INFO("main loop %p quit", handle->dispatcher_loop); return NULL; } -- 2.7.4 From cc642fedbab811e4daa7bfc60c700d9488031804 Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Wed, 27 Jun 2018 19:26:32 +0900 Subject: [PATCH 05/16] Remove the unnecessary argument of main loop Change-Id: I5dda96ad9f1ac5a75638c819bdb7d2d6e7d1bc15 --- packaging/mm-resource-manager.spec | 2 +- src/daemon/backend/mm_resource_manager_backend.c | 10 +++++----- src/daemon/backend/mm_resource_manager_backend.h | 6 +++--- src/daemon/backend/murphy/mm_resource_manager_backend.c | 2 +- src/daemon/mm_resource_manager_daemon.c | 2 +- src/daemon/mm_resource_manager_daemon_priv.c | 4 ++-- src/daemon/mm_resource_manager_daemon_priv.h | 4 ++-- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/packaging/mm-resource-manager.spec b/packaging/mm-resource-manager.spec index 168737d..951acb2 100644 --- a/packaging/mm-resource-manager.spec +++ b/packaging/mm-resource-manager.spec @@ -1,6 +1,6 @@ Name: mm-resource-manager Summary: A Multimedia Resource Manager API -Version: 0.2.6 +Version: 0.2.7 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/daemon/backend/mm_resource_manager_backend.c b/src/daemon/backend/mm_resource_manager_backend.c index 2069ff6..a607d83 100644 --- a/src/daemon/backend/mm_resource_manager_backend.c +++ b/src/daemon/backend/mm_resource_manager_backend.c @@ -28,8 +28,8 @@ typedef struct { /* These functions must be defined by the back-end */ -int _mm_resource_manager_backend_init(GMainLoop *main_loop); -int _mm_resource_manager_backend_deinit(); +int _mm_resource_manager_backend_init(void); +int _mm_resource_manager_backend_deinit(void); int _mm_resource_manager_backend_acquire(mm_resource_manager_res_type_e type); int _mm_resource_manager_backend_release(mm_resource_manager_res_type_e type); @@ -39,7 +39,7 @@ static mm_resource_manager_backend_res_s resources[MM_RESOURCE_MANAGER_RES_TYPE_ -int mm_resource_manager_backend_init(GMainLoop *main_loop) +int mm_resource_manager_backend_init(void) { int i; @@ -49,10 +49,10 @@ int mm_resource_manager_backend_init(GMainLoop *main_loop) resources[i].last_ref_counter = 0; } - return _mm_resource_manager_backend_init(main_loop); + return _mm_resource_manager_backend_init(); } -int mm_resource_manager_backend_deinit() +int mm_resource_manager_backend_deinit(void) { int i; diff --git a/src/daemon/backend/mm_resource_manager_backend.h b/src/daemon/backend/mm_resource_manager_backend.h index d5654fc..3271400 100644 --- a/src/daemon/backend/mm_resource_manager_backend.h +++ b/src/daemon/backend/mm_resource_manager_backend.h @@ -21,11 +21,11 @@ #include -int mm_resource_manager_backend_init(GMainLoop *main_loop); -int mm_resource_manager_backend_deinit(); +int mm_resource_manager_backend_init(void); +int mm_resource_manager_backend_deinit(void); int mm_resource_manager_backend_acquire(mm_resource_manager_res_type_e type); int mm_resource_manager_backend_release(mm_resource_manager_res_type_e type); int mm_resource_manager_backend_commit(mm_resource_manager_res_type_e type); -gboolean mm_resource_manager_backend_commit_all(); +gboolean mm_resource_manager_backend_commit_all(void); #endif /* __MM_RESOURCE_MANAGER_BACKEND__ */ diff --git a/src/daemon/backend/murphy/mm_resource_manager_backend.c b/src/daemon/backend/murphy/mm_resource_manager_backend.c index 4eef06d..f48102d 100644 --- a/src/daemon/backend/murphy/mm_resource_manager_backend.c +++ b/src/daemon/backend/murphy/mm_resource_manager_backend.c @@ -35,7 +35,7 @@ static void __mm_resource_manager_release_cb(mm_resource_manager_res_type_e type -int _mm_resource_manager_backend_init(GMainLoop *main_loop) +int _mm_resource_manager_backend_init(void) { int ret; int i; diff --git a/src/daemon/mm_resource_manager_daemon.c b/src/daemon/mm_resource_manager_daemon.c index 5232e4c..3287f9c 100644 --- a/src/daemon/mm_resource_manager_daemon.c +++ b/src/daemon/mm_resource_manager_daemon.c @@ -101,7 +101,7 @@ static daemonize_result_e daemonize(const char *path) static gboolean init_event(gpointer user_data) { MM_RM_DEBUG("main loop = %p", main_loop); - init_failed = !_mmrm_dmn_init(main_loop); + init_failed = !_mmrm_dmn_init(); if (init_failed) g_main_loop_quit(main_loop); diff --git a/src/daemon/mm_resource_manager_daemon_priv.c b/src/daemon/mm_resource_manager_daemon_priv.c index 981ba49..567dbed 100644 --- a/src/daemon/mm_resource_manager_daemon_priv.c +++ b/src/daemon/mm_resource_manager_daemon_priv.c @@ -98,14 +98,14 @@ static gboolean __wait_for_release_cb_sync(mm_resource_manager_id id); -gboolean _mmrm_dmn_init(GMainLoop *main_loop) +gboolean _mmrm_dmn_init(void) { unlink(RELEASE_CB_SYNC_PATH); MM_RM_RETVM_IF(mkfifo(RELEASE_CB_SYNC_PATH, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IWOTH) == -1, FALSE, "Release callback sync cannot be created"); - MM_RM_RETVM_IF(mm_resource_manager_backend_init(main_loop) != + MM_RM_RETVM_IF(mm_resource_manager_backend_init() != MM_RESOURCE_MANAGER_ERROR_NONE, FALSE, "Back-end cannot be initialized"); diff --git a/src/daemon/mm_resource_manager_daemon_priv.h b/src/daemon/mm_resource_manager_daemon_priv.h index 884ab77..e621a4f 100644 --- a/src/daemon/mm_resource_manager_daemon_priv.h +++ b/src/daemon/mm_resource_manager_daemon_priv.h @@ -26,8 +26,8 @@ typedef struct { } mm_resource_manager_dmn_res_request_s; typedef mm_resource_manager_dmn_res_request_s *mm_resource_manager_dmn_res_request_p; -gboolean _mmrm_dmn_init(GMainLoop *main_loop); -gboolean _mmrm_dmn_deinit(); +gboolean _mmrm_dmn_init(void); +gboolean _mmrm_dmn_deinit(void); mm_resource_manager_error_e _mmrm_dmn_create( mm_resource_manager_app_class_e app_class, mm_resource_manager_id *id); mm_resource_manager_error_e _mmrm_dmn_destroy(mm_resource_manager_id id); -- 2.7.4 From 7c065e29cd83647756328cb5c02e3d32f7a9b452 Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Tue, 24 Jul 2018 14:26:09 +0900 Subject: [PATCH 06/16] Revise the pid file issue at boot and reuse it for lock file Change-Id: Icc2a2b858a050895f04745959c9870c328730cdc --- packaging/mm-resource-manager.spec | 2 +- src/daemon/mm_resource_manager_daemon.c | 80 ++++++++++++++++----------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/packaging/mm-resource-manager.spec b/packaging/mm-resource-manager.spec index 951acb2..96e0390 100644 --- a/packaging/mm-resource-manager.spec +++ b/packaging/mm-resource-manager.spec @@ -1,6 +1,6 @@ Name: mm-resource-manager Summary: A Multimedia Resource Manager API -Version: 0.2.7 +Version: 0.2.8 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/daemon/mm_resource_manager_daemon.c b/src/daemon/mm_resource_manager_daemon.c index 3287f9c..147551a 100644 --- a/src/daemon/mm_resource_manager_daemon.c +++ b/src/daemon/mm_resource_manager_daemon.c @@ -34,8 +34,7 @@ #define PID_FILE "/tmp/.mm-res-mgr.pid" -#define LOCK_FILE "/tmp/.mm-res-mgr.lock" - +#define PID_MSG_LEN (16) typedef enum { @@ -46,7 +45,6 @@ typedef enum { -static int fdLock; static GMainLoop *main_loop; static gboolean init_failed = FALSE; static gboolean restart = FALSE; @@ -56,10 +54,8 @@ static gboolean restart = FALSE; static daemonize_result_e daemonize(); static gboolean init_event(gpointer user_data); static void daemon_loop(); -static int create_pid_file(); +static gboolean create_pid_file(); static int remove_pid_file(); -static int create_lock_file(); -static int remove_lock_file(); static int set_signal_handlers(); static void terminate_handler(int signum); static void reload_conf_handler(int signum); @@ -134,47 +130,55 @@ static void daemon_loop() } while (restart); } -static int create_pid_file() +static gboolean create_pid_file() { - int ret = FALSE; + int fd; + struct flock lock; + char pid_buf[PID_MSG_LEN] = {'\0',}; + + fd = open(PID_FILE, O_WRONLY | O_CREAT, (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)); + MM_RM_RETVM_IF(fd < 0, FALSE, "PID file cannot be created (%d)", errno); + + lock.l_type = F_WRLCK; + lock.l_start = 0; + lock.l_whence = SEEK_SET; + lock.l_len = 1000; + + if (fcntl(fd, F_SETLK, &lock) < 0) { + if (errno != EACCES && errno != EAGAIN) + MM_RM_ERROR("Fail to lock pidfile [%d]", errno); + else + MM_RM_ERROR("process is already running"); - FILE *fp = fopen(PID_FILE, "w"); - if (fp != NULL) { - ret = fprintf(fp, "%d", getpid()) > 0; - ret = fclose(fp) == 0 && ret; + goto error; } - return ret; -} -static int remove_pid_file() -{ - return unlink(PID_FILE) == 0; -} + if (ftruncate(fd, 0) < 0) { + MM_RM_ERROR("Fail to truncate pidfile [%d]", errno); + goto error; + } -static int create_lock_file() -{ - struct flock lock = { - .l_type = F_WRLCK, - .l_start = 0, - .l_whence = SEEK_SET, - .l_len = 1000 - }; - - fdLock = creat(LOCK_FILE, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); - MM_RM_RETVM_IF(fdLock == -1, FALSE, "Lock-file cannot be created"); - - if (fcntl(fdLock, F_SETLK, &lock) == -1) { - MM_RM_ERROR("Lock-file cannot be locked. The daemon is already running."); - close(fdLock); - return FALSE; + memset(pid_buf, 0, sizeof(pid_buf)); + snprintf(pid_buf, sizeof(pid_buf), "%u", getpid()); + + if (write(fd, pid_buf, strlen(pid_buf)) != (int)strlen(pid_buf)) { + MM_RM_ERROR("Fail to write pid to pidfile [%d]", errno); + goto error; } + close(fd); + + MM_RM_INFO("PID file (%s) is created", PID_FILE); return TRUE; + +error: + close(fd); + return FALSE; } -static int remove_lock_file() +static int remove_pid_file() { - return close(fdLock) == 0 && unlink(LOCK_FILE) == 0; + return unlink(PID_FILE) == 0; } static int set_signal_handlers() @@ -231,8 +235,6 @@ int main(int argc, char *argv[]) case MM_RESOURCE_MANAGER_DAEMON_NOW: MM_RM_RETVM_IF(!set_signal_handlers(), EXIT_FAILURE, "Daemon cannot set signal handlers"); - MM_RM_RETVM_IF(!create_lock_file(), EXIT_FAILURE, - "Daemon cannot create lock-file"); MM_RM_RETVM_IF(!create_pid_file(), EXIT_FAILURE, "Daemon cannot create pid-file"); @@ -240,8 +242,6 @@ int main(int argc, char *argv[]) MM_RM_RETVM_IF(!remove_pid_file(), EXIT_FAILURE, "Daemon cannot remove pid-file"); - MM_RM_RETVM_IF(!remove_lock_file(), EXIT_FAILURE, - "Daemon cannot remove lock-file"); case MM_RESOURCE_MANAGER_DAEMON_PARENT: return EXIT_SUCCESS; -- 2.7.4 From e0234b2d2c61f3e74c0a4a384c6b1569b7d0ab71 Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Wed, 25 Jul 2018 12:18:07 +0900 Subject: [PATCH 07/16] Remove dbus.service at the Requires Change-Id: I050d1cfb701bdb3016120d7cb63010aeb3a53b2d --- packaging/mm-resource-manager.spec | 2 +- packaging/mm-resource-managerd.service | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/mm-resource-manager.spec b/packaging/mm-resource-manager.spec index 96e0390..f6ee620 100644 --- a/packaging/mm-resource-manager.spec +++ b/packaging/mm-resource-manager.spec @@ -1,6 +1,6 @@ Name: mm-resource-manager Summary: A Multimedia Resource Manager API -Version: 0.2.8 +Version: 0.2.9 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/packaging/mm-resource-managerd.service b/packaging/mm-resource-managerd.service index 94ad67e..cd8cac2 100644 --- a/packaging/mm-resource-managerd.service +++ b/packaging/mm-resource-managerd.service @@ -1,6 +1,6 @@ [Unit] Description=Multimedia Resource Manager -Requires=murphyd.service dbus.service +Requires=murphyd.service After=murphyd.service dbus.service Before=muse-server.service -- 2.7.4 From 9c118de78a6e73c56bf0e48bd1df692150e3fc9a Mon Sep 17 00:00:00 2001 From: "heechul.jeon" Date: Mon, 3 Sep 2018 15:14:31 +0900 Subject: [PATCH 08/16] [Coverity] Adding return value checker and put some error logs on debus interface registration for further analysis. Change-Id: I990f2dad8b9f8b847a6bbd1010c29afe479f1253 --- src/daemon/mm_resource_manager_daemon_dbus.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) mode change 100644 => 100755 src/daemon/mm_resource_manager_daemon_dbus.c diff --git a/src/daemon/mm_resource_manager_daemon_dbus.c b/src/daemon/mm_resource_manager_daemon_dbus.c old mode 100644 new mode 100755 index 98ad80c..7e4d2c8 --- a/src/daemon/mm_resource_manager_daemon_dbus.c +++ b/src/daemon/mm_resource_manager_daemon_dbus.c @@ -257,6 +257,7 @@ static gboolean on_commit_handle(MMResourceManager *interface, static void on_bus_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data) { + GError* error = NULL; MM_RM_DEBUG("name of bus = %s, userID = %d", name, getuid()); g_signal_connect(interface, "handle-conf", @@ -265,6 +266,9 @@ static void on_bus_acquired(GDBusConnection *connection, const gchar *name, g_signal_connect(interface, "handle-destroy", G_CALLBACK(on_destroy_handle), NULL); g_signal_connect(interface, "handle-commit", G_CALLBACK(on_commit_handle), NULL); - g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(interface), - connection, RMD_GDBUS_PATH, NULL); + if (!g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(interface), + connection, RMD_GDBUS_PATH, &error)) { + MM_RM_ERROR("failed to export interface. msg : %s", error->message); + g_error_free(error); + } } -- 2.7.4 From 1f711de51c171add881b3e96ee7df764cafa473f Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Thu, 18 Oct 2018 15:14:57 +0900 Subject: [PATCH 09/16] Update to wait until the child processe called by fork() completes Change-Id: I08388fb43fa479700b4d0027d45478d9ef2e3562 --- packaging/mm-resource-manager.spec | 2 +- src/daemon/mm_resource_manager_daemon.c | 48 ++++++++++++++++++++++------ src/daemon/mm_resource_manager_daemon_dbus.c | 15 ++++++++- src/daemon/mm_resource_manager_daemon_priv.h | 4 +++ 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/packaging/mm-resource-manager.spec b/packaging/mm-resource-manager.spec index f6ee620..c54902a 100644 --- a/packaging/mm-resource-manager.spec +++ b/packaging/mm-resource-manager.spec @@ -1,6 +1,6 @@ Name: mm-resource-manager Summary: A Multimedia Resource Manager API -Version: 0.2.9 +Version: 0.2.10 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/daemon/mm_resource_manager_daemon.c b/src/daemon/mm_resource_manager_daemon.c index 147551a..0596b7d 100644 --- a/src/daemon/mm_resource_manager_daemon.c +++ b/src/daemon/mm_resource_manager_daemon.c @@ -48,10 +48,11 @@ typedef enum { static GMainLoop *main_loop; static gboolean init_failed = FALSE; static gboolean restart = FALSE; +int notify_fd; - -static daemonize_result_e daemonize(); +static gboolean fork_wait(void); +static daemonize_result_e daemonize(const char *path); static gboolean init_event(gpointer user_data); static void daemon_loop(); static gboolean create_pid_file(); @@ -63,19 +64,48 @@ static void quit_main_loop(); -static daemonize_result_e daemonize(const char *path) +static gboolean fork_wait(void) { pid_t pid; + int fds[2]; + char msg[PID_MSG_LEN] = {'\0',}; + + MM_RM_RETVM_IF(pipe(fds) == -1, FALSE, "Failed to create pipe to get child status"); + + MM_RM_RETVM_IF((pid = fork()) < 0, FALSE, "Daemon fork failed"); + + if (pid != 0) { + close(fds[1]); + + /* Read in a string from the pipe */ + MM_RM_RETVM_IF(read(fds[0], msg, sizeof(msg)) < 0, + FALSE, "Failed to create pipe to get child status"); + + close(fds[0]); - pid = fork(); - MM_RM_RETVM_IF(pid < 0, MM_RESOURCE_MANAGER_DAEMON_FAIL, - "Daemon fork failed"); + /* Parent process closes up output side of pipe */ + if (!strcmp(msg, MSG_DONE)) { + MM_RM_DEBUG("Successfully daemonized"); + exit(EXIT_SUCCESS); + } else { + MM_RM_ERROR("Daemonizing failed after fork"); + exit(EXIT_FAILURE); + } + } else if (pid == 0) { + /* Child process closes up input side of pipe */ + close(fds[0]); - if (pid > 0) { - MM_RM_DEBUG("Daemon fork succeeded"); - return MM_RESOURCE_MANAGER_DAEMON_PARENT; + notify_fd = fds[1]; } + return TRUE; +} + +static daemonize_result_e daemonize(const char *path) +{ + MM_RM_RETVM_IF(fork_wait() == FALSE, MM_RESOURCE_MANAGER_DAEMON_FAIL, + "Daemon fork&wait to set waiting until child process of fork actually completes failed"); + umask(0); MM_RM_RETVM_IF(setsid() < 0, MM_RESOURCE_MANAGER_DAEMON_FAIL, "Daemon cannot set session id"); diff --git a/src/daemon/mm_resource_manager_daemon_dbus.c b/src/daemon/mm_resource_manager_daemon_dbus.c index 7e4d2c8..470b617 100755 --- a/src/daemon/mm_resource_manager_daemon_dbus.c +++ b/src/daemon/mm_resource_manager_daemon_dbus.c @@ -24,9 +24,10 @@ static MMResourceManager *interface; - +extern int notify_fd; static void __gv2c_array(GVariantIter *gv, mm_resource_manager_dmn_res_request_s **c); +static void _notify_fork_done(void); static gboolean on_create_handle(MMResourceManager *interface, GDBusMethodInvocation *invocation, const gint app_class, gpointer user_data); @@ -148,6 +149,16 @@ static void __gv2c_array(GVariantIter *gv, mm_resource_manager_dmn_res_request_s *c = rs; } +void _notify_fork_done(void) +{ + /* Send "string" through the output side of pipe */ + MM_RM_RETM_IF(write(notify_fd, MSG_DONE, strlen(MSG_DONE) + 1) < 0, + "Failed to notify parent process that child initialization is done"); + + MM_RM_DEBUG("[%d] Notify parent process that child initialization is done", notify_fd); + close(notify_fd); +} + static gboolean on_get_conf(MMResourceManager *interface, GDBusMethodInvocation *invocation, gpointer user_data) { @@ -271,4 +282,6 @@ static void on_bus_acquired(GDBusConnection *connection, const gchar *name, MM_RM_ERROR("failed to export interface. msg : %s", error->message); g_error_free(error); } + + _notify_fork_done(); } diff --git a/src/daemon/mm_resource_manager_daemon_priv.h b/src/daemon/mm_resource_manager_daemon_priv.h index e621a4f..6d9909c 100644 --- a/src/daemon/mm_resource_manager_daemon_priv.h +++ b/src/daemon/mm_resource_manager_daemon_priv.h @@ -19,6 +19,10 @@ #include "common/mm_resource_manager_utils.h" +#define MSG_DONE "DONE" + + + typedef struct { mm_resource_manager_res_type_e type; mm_resource_manager_res_volume volume; -- 2.7.4 From b4a22852742b9211275cbcd5c574c151725f6f2f Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Tue, 11 Dec 2018 18:55:12 +0900 Subject: [PATCH 10/16] Create the server ready file Change-Id: I86b9a0072ccc793a328fac528f21a62742e99a1a --- packaging/mm-resource-manager.spec | 2 +- src/daemon/mm_resource_manager_daemon.c | 64 +++++++++++++++++++++++++++------ src/lib/mm_resource_manager.h | 9 +++++ 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/packaging/mm-resource-manager.spec b/packaging/mm-resource-manager.spec index c54902a..5c792ac 100644 --- a/packaging/mm-resource-manager.spec +++ b/packaging/mm-resource-manager.spec @@ -1,6 +1,6 @@ Name: mm-resource-manager Summary: A Multimedia Resource Manager API -Version: 0.2.10 +Version: 0.2.11 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/daemon/mm_resource_manager_daemon.c b/src/daemon/mm_resource_manager_daemon.c index 0596b7d..f34ed28 100644 --- a/src/daemon/mm_resource_manager_daemon.c +++ b/src/daemon/mm_resource_manager_daemon.c @@ -55,8 +55,12 @@ static gboolean fork_wait(void); static daemonize_result_e daemonize(const char *path); static gboolean init_event(gpointer user_data); static void daemon_loop(); -static gboolean create_pid_file(); -static int remove_pid_file(); +static gboolean create_pid_file(void); +static gboolean create_ready_file(void); +static gboolean create_daemon_setup_file(void); +static gboolean remove_pid_file(void); +static gboolean remove_ready_file(void); +static gboolean remove_daemon_setup_file(void); static int set_signal_handlers(); static void terminate_handler(int signum); static void reload_conf_handler(int signum); @@ -160,7 +164,7 @@ static void daemon_loop() } while (restart); } -static gboolean create_pid_file() +static gboolean create_pid_file(void) { int fd; struct flock lock; @@ -206,9 +210,49 @@ error: return FALSE; } -static int remove_pid_file() +static gboolean create_ready_file(void) { - return unlink(PID_FILE) == 0; + int fd = -1; + + if ((fd = creat(MM_RESOURCE_MANAGER_READY, 0644)) != -1) { + MM_RM_INFO("ready file(%s) file was created", MM_RESOURCE_MANAGER_READY); + close(fd); + } else { + MM_RM_ERROR("cannot create ready file(%s), errno(%d)", MM_RESOURCE_MANAGER_READY, errno); + return FALSE; + } + + return TRUE; +} + +static gboolean create_daemon_setup_file(void) +{ + return create_pid_file() && create_ready_file(); +} + +static gboolean remove_pid_file(void) +{ + if (unlink(PID_FILE) != 0) { + LOGE("%s : unlink failed, errno(%d)", PID_FILE, errno); + return FALSE; + } + + return TRUE; +} + +static gboolean remove_ready_file(void) +{ + if (unlink(MM_RESOURCE_MANAGER_READY) != 0) { + LOGE("%s : unlink failed, errno(%d)", MM_RESOURCE_MANAGER_READY, errno); + return FALSE; + } + + return TRUE; +} + +static gboolean remove_daemon_setup_file(void) +{ + return remove_pid_file() && remove_ready_file(); } static int set_signal_handlers() @@ -256,8 +300,6 @@ static void quit_main_loop() } } - - int main(int argc, char *argv[]) { switch (daemonize(NULL)) { @@ -265,13 +307,13 @@ int main(int argc, char *argv[]) case MM_RESOURCE_MANAGER_DAEMON_NOW: MM_RM_RETVM_IF(!set_signal_handlers(), EXIT_FAILURE, "Daemon cannot set signal handlers"); - MM_RM_RETVM_IF(!create_pid_file(), EXIT_FAILURE, - "Daemon cannot create pid-file"); + MM_RM_RETVM_IF(!create_daemon_setup_file(), EXIT_FAILURE, + "Daemon cannot create setup file"); daemon_loop(); - MM_RM_RETVM_IF(!remove_pid_file(), EXIT_FAILURE, - "Daemon cannot remove pid-file"); + MM_RM_RETVM_IF(!remove_daemon_setup_file(), EXIT_FAILURE, + "Daemon cannot remove setup file"); case MM_RESOURCE_MANAGER_DAEMON_PARENT: return EXIT_SUCCESS; diff --git a/src/lib/mm_resource_manager.h b/src/lib/mm_resource_manager.h index 964dabf..ee3c228 100644 --- a/src/lib/mm_resource_manager.h +++ b/src/lib/mm_resource_manager.h @@ -47,6 +47,15 @@ extern "C" { */ +/** + * @brief Generated file right after daemonizing normally. + * + * @since_tizen 5.5 + */ +#define MM_RESOURCE_MANAGER_READY "/tmp/.mm_res_mgr_ready" + + + /** * @brief Defining full volume of a resource. -- 2.7.4 From 360bac9dbc3987ad0ae1b7c457c9f9717a07f7da Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Mon, 17 Dec 2018 16:08:12 +0900 Subject: [PATCH 11/16] Fix the dlog's invalid format Change-Id: I72e0bf3f2641c41d7b8cfa8b887aaddccd4e5e1f --- packaging/mm-resource-manager.spec | 2 +- src/daemon/mm_resource_manager_daemon_dbus.c | 4 ++-- src/daemon/mm_resource_manager_daemon_priv.c | 21 +++++++++++---------- src/lib/mm_resource_manager_priv.c | 26 +++++++++++++------------- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/packaging/mm-resource-manager.spec b/packaging/mm-resource-manager.spec index 5c792ac..a62b870 100644 --- a/packaging/mm-resource-manager.spec +++ b/packaging/mm-resource-manager.spec @@ -1,6 +1,6 @@ Name: mm-resource-manager Summary: A Multimedia Resource Manager API -Version: 0.2.11 +Version: 0.2.12 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/daemon/mm_resource_manager_daemon_dbus.c b/src/daemon/mm_resource_manager_daemon_dbus.c index 470b617..cd9ffb5 100755 --- a/src/daemon/mm_resource_manager_daemon_dbus.c +++ b/src/daemon/mm_resource_manager_daemon_dbus.c @@ -97,11 +97,11 @@ int _mmrm_dmn_dbus_commit(mm_resource_manager_id id, GVariantIter *release, mm_resource_manager_dmn_res_request_s *release_requests = NULL, *acquire_requests = NULL; - MM_RM_DEBUG("Commit release request of %u items", + MM_RM_DEBUG("Commit release request of %"G_GSIZE_FORMAT" items", g_variant_iter_n_children(release)); __gv2c_array(release, &release_requests); - MM_RM_DEBUG("Commit acquire request of %u items", + MM_RM_DEBUG("Commit acquire request of %"G_GSIZE_FORMAT" items", g_variant_iter_n_children(acquire)); __gv2c_array(acquire, &acquire_requests); diff --git a/src/daemon/mm_resource_manager_daemon_priv.c b/src/daemon/mm_resource_manager_daemon_priv.c index 567dbed..b09efff 100644 --- a/src/daemon/mm_resource_manager_daemon_priv.c +++ b/src/daemon/mm_resource_manager_daemon_priv.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "daemon/mm_resource_manager_daemon_priv.h" #include "daemon/mm_resource_manager_daemon_conf.h" @@ -185,7 +186,7 @@ mm_resource_manager_error_e _mmrm_dmn_destroy(mm_resource_manager_id id) MM_RM_RETVM_IF(i_man == MM_RESOURCE_MANGER_NOT_FOUND, MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, - "Resource manager #%llx doesn't exist", _mm_rm_hash64(id)); + "Resource manager #%"PRIu64" doesn't exist", _mm_rm_hash64(id)); __release_all_resources((mm_resource_manager_dmn_s*)managers->pdata[i_man]); mm_resource_manager_backend_commit_all(); @@ -206,7 +207,7 @@ mm_resource_manager_error_e _mmrm_dmn_commit(mm_resource_manager_id id, MM_RM_RETVM_IF(manager == NULL, MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, - "Resource manager #%llx doesn't exist", _mm_rm_hash64(id)); + "Resource manager #%"PRIu64" doesn't exist", _mm_rm_hash64(id)); MM_RM_RETVM_IF( (releases == NULL || releases[0].type == MM_RESOURCE_MANAGER_NO_RES) && (acquires == NULL || acquires[0].type == MM_RESOURCE_MANAGER_NO_RES), @@ -563,7 +564,7 @@ static GArray* __handle_acquire_requests(mm_resource_manager_dmn_p manager, i_man->resources[request->type]->parts = NULL; i_man->resources[request->type]->is_acquired = FALSE; - MM_RM_DEBUG("All parts of %s are released in RM #%llx", + MM_RM_DEBUG("All parts of %s are released in RM %"PRIu64, res_name, _mm_rm_hash64(i_man->id)); } else { __add_cb_request(cb_requests, i_man, request->type, @@ -573,7 +574,7 @@ static GArray* __handle_acquire_requests(mm_resource_manager_dmn_p manager, i_man->resources[request->type]->is_acquired = FALSE; - MM_RM_DEBUG("Full resource %s is released in RM #%llx", + MM_RM_DEBUG("Full resource %s is released in RM %"PRIu64, res_name, _mm_rm_hash64(i_man->id)); break; } @@ -607,7 +608,7 @@ static GArray* __handle_acquire_requests(mm_resource_manager_dmn_p manager, i_man->resources[request->type]->is_acquired = FALSE; is_released_fully = TRUE; - MM_RM_DEBUG("Full resource %s is released in RM #%llx", + MM_RM_DEBUG("Full resource %s is released in RM %"PRIu64, res_name, _mm_rm_hash64(i_man->id)); break; } @@ -638,7 +639,7 @@ static GArray* __handle_acquire_requests(mm_resource_manager_dmn_p manager, enough_volume = request->volume + acquired_volume <= conf->max_volume[request->type]; - MM_RM_DEBUG("%d units of %s are released in RM #%llx", + MM_RM_DEBUG("%d units of %s are released in RM %"PRIu64, g_array_index(parts, mm_resource_manager_res_volume, 0), res_name, _mm_rm_hash64(i_man->id)); @@ -650,7 +651,7 @@ static GArray* __handle_acquire_requests(mm_resource_manager_dmn_p manager, if (!parts->len) { MM_RM_DEBUG("Part array of %s is empty and will be " - "freed in RM #%llx", res_name, + "freed in RM %"PRIu64, res_name, _mm_rm_hash64(i_man->id)); g_array_free(parts, TRUE); i_man->resources[request->type]->parts = NULL; @@ -687,7 +688,7 @@ static void __handle_release_callbacks(GArray *requests) mm_resource_manager_dmn_release_cb_request_s, i); id = request->manager->id; MM_RM_HASH64(id); - MM_RM_DEBUG("Sending release callback to RM #%llx for %s of volume %d", + MM_RM_DEBUG("Sending release callback to RM #%"PRIu64" for %s of volume %d", id, _mm_resource_manager_get_res_str(request->type), request->volume); _mmrm_dmn_dbus_release_callback(id, request->type, request->volume); @@ -775,7 +776,7 @@ static gboolean __wait_for_release_cb_sync(mm_resource_manager_id id) if (read_size == sizeof(recv_id)) { ret = id == recv_id; if (ret == FALSE) - MM_RM_ERROR("Sync is received from wrong client #%llx", + MM_RM_ERROR("Sync is received from wrong client #%"PRIu64, recv_id); /* * Wait POLLHUP to avoid situation when client sent last sync @@ -788,7 +789,7 @@ static gboolean __wait_for_release_cb_sync(mm_resource_manager_id id) (sync.revents & (POLLHUP | POLLERR)) == 0) MM_RM_ERROR("The client didn't close the FIFO"); } else { - MM_RM_ERROR("Read is failed (revents=%hd,read_size=%d)", + MM_RM_ERROR("Read is failed (revents=%hd,read_size=%zd)", sync.revents, read_size); ret = FALSE; } diff --git a/src/lib/mm_resource_manager_priv.c b/src/lib/mm_resource_manager_priv.c index 1e8f00c..4996587 100644 --- a/src/lib/mm_resource_manager_priv.c +++ b/src/lib/mm_resource_manager_priv.c @@ -201,7 +201,7 @@ int _mm_resource_manager_create(mm_resource_manager_app_class_e app_class, g_mutex_lock(&handles_lock); g_ptr_array_add(handles, handle); - MM_RM_INFO("Resource manager #%llx is created", _mm_rm_hash64(handle->id)); + MM_RM_INFO("Resource manager #%"PRIu64" is created", _mm_rm_hash64(handle->id)); g_mutex_unlock(&handles_lock); return MM_RESOURCE_MANAGER_ERROR_NONE; @@ -234,7 +234,7 @@ int _mm_resource_manager_destroy(mm_resource_manager_h rm) free(handle); if (ret == MM_RESOURCE_MANAGER_ERROR_NONE) - MM_RM_INFO("Resource manager #%llx is destroyed", _mm_rm_hash64(id)); + MM_RM_INFO("Resource manager #%"PRIu64" is destroyed", _mm_rm_hash64(id)); return ret; } @@ -261,7 +261,7 @@ int _mm_resource_manager_mark_for_acquire( *resource_h = resource; MM_RM_INFO("Resource %p of type %d with volume %d is marked for acquire in " - "resource manager #%llx", *resource_h, type, volume, + "resource manager #%"PRIu64, *resource_h, type, volume, _mm_rm_hash64(handle->id)); g_mutex_unlock(&handle->resources_lock); @@ -326,7 +326,7 @@ int _mm_resource_manager_resize_marked(mm_resource_manager_h rm, break; } - MM_RM_INFO("Resource %p is resized for acquire in resource manager #%llx", + MM_RM_INFO("Resource %p is resized for acquire in resource manager #%"PRIu64, resource_h, _mm_rm_hash64(handle->id)); g_mutex_unlock(&handle->resources_lock); @@ -353,7 +353,7 @@ int _mm_resource_manager_mark_for_release(mm_resource_manager_h rm, __mark_resource_for_release(handle->resources, i, resource); - MM_RM_INFO("Resource %p is marked for release in resource manager #%llx", + MM_RM_INFO("Resource %p is marked for release in resource manager #%"PRIu64, resource_h, _mm_rm_hash64(handle->id)); g_mutex_unlock(&handle->resources_lock); @@ -377,7 +377,7 @@ int _mm_resource_manager_mark_all_for_release(mm_resource_manager_h rm) } } - MM_RM_INFO("All resources are marked for release in resource manager #%llx", + MM_RM_INFO("All resources are marked for release in resource manager #%"PRIu64, _mm_rm_hash64(handle->id)); g_mutex_unlock(&handle->resources_lock); @@ -407,7 +407,7 @@ int _mm_resource_manager_get_resource_info(mm_resource_manager_h rm, info->volume = resource->volume; info->is_acquire_failed = resource->is_acquire_failed; - MM_RM_INFO("Info structure of resource %p in resource manager #%llx is filled", + MM_RM_INFO("Info structure of resource %p in resource manager #%"PRIu64" is filled", resource_h, _mm_rm_hash64(handle->id)); g_mutex_unlock(&handle->resources_lock); @@ -426,7 +426,7 @@ int _mm_resource_manager_commit(mm_resource_manager_h rm) ret = __dbus_commit(handle); if (ret == MM_RESOURCE_MANAGER_ERROR_NONE) { - MM_RM_INFO("Changes in resource manager #%llx have been committed successfully", + MM_RM_INFO("Changes in resource manager #%"PRIu64" have been committed successfully", _mm_rm_hash64(handle->id)); } else { MM_RM_ERROR("Dbus commit request failed"); @@ -450,7 +450,7 @@ int _mm_resource_manager_set_status_cb(mm_resource_manager_h rm, handle->status_cb.user_data = user_data; g_mutex_unlock(&handle->resources_lock); - MM_RM_INFO("Status callback %p in resource manager #%llx is set", cb, + MM_RM_INFO("Status callback %p in resource manager #%"PRIu64" is set", cb, _mm_rm_hash64(handle->id)); return MM_RESOURCE_MANAGER_ERROR_NONE; @@ -497,7 +497,7 @@ void __mm_resource_manager_release_callback(mm_resource_manager_s *handle, gboolean release_all = FALSE; int j; - MM_RM_DEBUG("Release callback is emitted for %s of volume %d in RM #%llx", + MM_RM_DEBUG("Release callback is emitted for %s of volume %d in RM #%"PRIu64, _mm_resource_manager_get_res_str(type), volume, id); handle_id = handle->id; @@ -796,7 +796,7 @@ static int __dbus_create(mm_resource_manager_s *handle, &rm_error, NULL, &error); MM_RM_RET_IF_GERR(error, "DBus create msg cannot be sent"); - MM_RM_DEBUG("Create returned id - #%llx, error - %d", + MM_RM_DEBUG("Create returned id - #%"PRIu64", error - %d", _mm_rm_hash64(handle->id), rm_error); return rm_error; @@ -811,7 +811,7 @@ static int __dbus_destroy(mm_resource_manager_s *handle) NULL, &error); MM_RM_RET_IF_GERR(error, "DBus destroy msg cannot be sent"); - MM_RM_DEBUG("Destroy for id - #%llx returned error - %d", + MM_RM_DEBUG("Destroy for id - #%"PRIu64" returned error - %d", _mm_rm_hash64(handle->id), rm_error); return MM_RESOURCE_MANAGER_ERROR_NONE; @@ -879,7 +879,7 @@ static int __dbus_commit(mm_resource_manager_s *handle) if (error != NULL) MM_RM_RET_IF_GERR(error, "DBus commit msg cannot be sent"); - MM_RM_DEBUG("Commit for id - #%llx returned error - %d", + MM_RM_DEBUG("Commit for id - #%"PRIu64" returned error - %d", _mm_rm_hash64(handle->id), rm_error); if (rm_error == MM_RESOURCE_MANAGER_ERROR_NONE) { -- 2.7.4 From eec6fd6276a6f1ad81888a165d8bacd2c8b1f69e Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Tue, 18 Dec 2018 13:33:50 +0900 Subject: [PATCH 12/16] Update to add the error of resource manager launch failure Change-Id: I0224565ba8342f4110a19af5b01e985e62f8cb81 --- src/lib/mm_resource_manager.c | 5 +++-- src/lib/mm_resource_manager.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lib/mm_resource_manager.c b/src/lib/mm_resource_manager.c index a4a3333..2739901 100644 --- a/src/lib/mm_resource_manager.c +++ b/src/lib/mm_resource_manager.c @@ -18,8 +18,7 @@ #include "lib/mm_resource_manager_priv.h" #include "lib/mm_resource_manager.h" - - +#include int mm_resource_manager_create(mm_resource_manager_app_class_e app_class, mm_resource_manager_release_cb release_cb, void *cb_user_data, @@ -32,6 +31,8 @@ int mm_resource_manager_create(mm_resource_manager_app_class_e app_class, MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, "Wrong app class"); MM_RM_RETVM_IF(NULL == release_cb, MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, "Callback is NULL"); + MM_RM_RETVM_IF(access(MM_RESOURCE_MANAGER_READY, F_OK) != 0, + MM_RESOURCE_MANAGER_ERROR_LAUNCH_FAILURE, "Resource Manager Launch Failure"); return _mm_resource_manager_create(app_class, release_cb, cb_user_data, rm); } diff --git a/src/lib/mm_resource_manager.h b/src/lib/mm_resource_manager.h index ee3c228..c954fc3 100644 --- a/src/lib/mm_resource_manager.h +++ b/src/lib/mm_resource_manager.h @@ -140,6 +140,7 @@ typedef enum { MM_RESOURCE_MANAGER_ERROR_INVALID_STATE, /**< Invalid state */ MM_RESOURCE_MANAGER_ERROR_LOW_PRIORITY, /**< Low priority to acquire a resource */ MM_RESOURCE_MANAGER_ERROR_NOT_ENOUGH, /**< There are no enough free resource volume */ + MM_RESOURCE_MANAGER_ERROR_LAUNCH_FAILURE, /**< Resource manager is not launched */ } mm_resource_manager_error_e; /** -- 2.7.4 From 3459abbb7a4f06734bcf30ebbe86333a39e687f1 Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Thu, 10 Jan 2019 14:54:50 +0900 Subject: [PATCH 13/16] Fix the bug of gdbus conf Change-Id: Iaf0a2d972ae85274842a19754fd2f788cc8aad2f --- packaging/mm-resource-manager.spec | 2 +- src/daemon/mm_resource_manager_daemon_dbus.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/mm-resource-manager.spec b/packaging/mm-resource-manager.spec index a62b870..5a5f908 100644 --- a/packaging/mm-resource-manager.spec +++ b/packaging/mm-resource-manager.spec @@ -1,6 +1,6 @@ Name: mm-resource-manager Summary: A Multimedia Resource Manager API -Version: 0.2.12 +Version: 0.2.13 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/daemon/mm_resource_manager_daemon_dbus.c b/src/daemon/mm_resource_manager_daemon_dbus.c index cd9ffb5..168d16a 100755 --- a/src/daemon/mm_resource_manager_daemon_dbus.c +++ b/src/daemon/mm_resource_manager_daemon_dbus.c @@ -186,7 +186,7 @@ static gboolean on_get_conf(MMResourceManager *interface, res_cond_builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY); for (j = 0; j < MM_RESOURCE_MANAGER_RES_TYPE_COND_MAX; j++) { g_variant_builder_add_value(res_cond_builder, - g_variant_new("i", (*cond_volume)[i][j])); + g_variant_new("i", cond_volume[i][j])); } g_variant_builder_add_value(res_type_builder, g_variant_builder_end(res_cond_builder)); -- 2.7.4 From cf3a199d9dc944e2cc9dc67d82d1b9f73fce6c91 Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Thu, 14 Feb 2019 21:02:30 +0900 Subject: [PATCH 14/16] Resolve the ASAN issue of heap-use-after-free - Set null after free - Add null check for exceptions - Remove unnecessary variable and function call Change-Id: Idfc7f43b4928472d2e37240cb36f568463633a58 --- .../backend/murphy/mm_resource_manager_backend.c | 8 ++++++- .../backend/murphy/mm_resource_manager_mloop.c | 4 ++++ src/daemon/mm_resource_manager_daemon.c | 25 ++++++++++++---------- src/daemon/mm_resource_manager_daemon_dbus.c | 4 ---- src/lib/mm_resource_manager_priv.c | 6 +----- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/daemon/backend/murphy/mm_resource_manager_backend.c b/src/daemon/backend/murphy/mm_resource_manager_backend.c index f48102d..d8fde6d 100644 --- a/src/daemon/backend/murphy/mm_resource_manager_backend.c +++ b/src/daemon/backend/murphy/mm_resource_manager_backend.c @@ -58,9 +58,15 @@ int _mm_resource_manager_backend_init(void) int _mm_resource_manager_backend_deinit() { + int ret; + MM_RM_RETVM_IF(mrp == NULL, MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, "mloop is NULL"); - return _mm_resource_manager_mloop_destroy(mrp); + + ret = _mm_resource_manager_mloop_destroy(mrp); + mrp = NULL; + + return ret; } int _mm_resource_manager_backend_acquire(mm_resource_manager_res_type_e type) diff --git a/src/daemon/backend/murphy/mm_resource_manager_mloop.c b/src/daemon/backend/murphy/mm_resource_manager_mloop.c index 123e7e0..98deb9f 100644 --- a/src/daemon/backend/murphy/mm_resource_manager_mloop.c +++ b/src/daemon/backend/murphy/mm_resource_manager_mloop.c @@ -248,6 +248,10 @@ static gboolean __mm_resource_manager_mloop_list_resources(mrp_res_context_t *co static int __mm_resource_manager_mloop_wait_connection(mm_resource_manager_mloop_s *mrp) { + MM_RM_RETVM_IF(mrp == NULL, + MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, + "mainloop_s is null"); + g_mutex_lock(&mrp->lock); if (mrp->mrp_ctx && MRP_RES_CONNECTED == mrp->mrp_ctx->state) { diff --git a/src/daemon/mm_resource_manager_daemon.c b/src/daemon/mm_resource_manager_daemon.c index f34ed28..762f4ed 100644 --- a/src/daemon/mm_resource_manager_daemon.c +++ b/src/daemon/mm_resource_manager_daemon.c @@ -46,7 +46,6 @@ typedef enum { static GMainLoop *main_loop; -static gboolean init_failed = FALSE; static gboolean restart = FALSE; int notify_fd; @@ -80,7 +79,6 @@ static gboolean fork_wait(void) if (pid != 0) { close(fds[1]); - /* Read in a string from the pipe */ MM_RM_RETVM_IF(read(fds[0], msg, sizeof(msg)) < 0, FALSE, "Failed to create pipe to get child status"); @@ -131,8 +129,7 @@ static daemonize_result_e daemonize(const char *path) static gboolean init_event(gpointer user_data) { MM_RM_DEBUG("main loop = %p", main_loop); - init_failed = !_mmrm_dmn_init(); - if (init_failed) + if (!_mmrm_dmn_init()) g_main_loop_quit(main_loop); return G_SOURCE_REMOVE; @@ -140,27 +137,33 @@ static gboolean init_event(gpointer user_data) static void daemon_loop() { + guint id = 0; + do { restart = FALSE; - MM_RM_RETM_IF(g_timeout_add(0, init_event, NULL) <= 0, - "Init event cannot be added to main loop"); - - if (!mm_resource_manager_reload_conf()) - return; + MM_RM_RETM_IF(!mm_resource_manager_reload_conf(), + "Daemon cannot reload conf"); main_loop = g_main_loop_new(NULL, FALSE); MM_RM_RETM_IF(main_loop == NULL, "Daemon cannot create main loop"); + if ((id = g_timeout_add(100, init_event, NULL)) == 0) { + MM_RM_ERROR("Init event cannot be added to main loop"); + goto end; + } + MM_RM_INFO("Daemon loop [%p] is ran", main_loop); g_main_loop_run(main_loop); MM_RM_INFO("Daemon loop end"); - if (!init_failed) - _mmrm_dmn_deinit(); +end: + _mmrm_dmn_deinit(); g_main_loop_unref(main_loop); main_loop = NULL; + + MM_RM_RETM_IF(g_source_remove(id) == FALSE, "Failed to remove %d", id); } while (restart); } diff --git a/src/daemon/mm_resource_manager_daemon_dbus.c b/src/daemon/mm_resource_manager_daemon_dbus.c index 168d16a..aeaf80d 100755 --- a/src/daemon/mm_resource_manager_daemon_dbus.c +++ b/src/daemon/mm_resource_manager_daemon_dbus.c @@ -43,10 +43,6 @@ static void on_bus_acquired(GDBusConnection *connection, const gchar *name, int _mmrm_dmn_dbus_init() { -#if !GLIB_CHECK_VERSION(2, 35, 0) - g_type_init(); -#endif - interface = mmresource_manager_skeleton_new(); MM_RM_RETVM_IF(interface == NULL, MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION, diff --git a/src/lib/mm_resource_manager_priv.c b/src/lib/mm_resource_manager_priv.c index 4996587..1a8dc62 100644 --- a/src/lib/mm_resource_manager_priv.c +++ b/src/lib/mm_resource_manager_priv.c @@ -695,13 +695,9 @@ static int __dbus_init(mm_resource_manager_s *handle) MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION, "Dbus proxy is not NULL"); -#if !GLIB_CHECK_VERSION(2, 35, 0) - g_type_init(); -#endif - g_main_context_push_thread_default(handle->dispatcher_context); handle->dbus_proxy = mmresource_manager_proxy_new_for_bus_sync( - G_BUS_TYPE_SYSTEM, 0, RMD_GDBUS_NAME, RMD_GDBUS_PATH, NULL , &error); + G_BUS_TYPE_SYSTEM, 0, RMD_GDBUS_NAME, RMD_GDBUS_PATH, NULL, &error); g_main_context_pop_thread_default(handle->dispatcher_context); MM_RM_RET_IF_GERR(error, "Dbus proxy cannot be created"); -- 2.7.4 From 74ebb074138fa2a47b8da13364fd71b6f8824f62 Mon Sep 17 00:00:00 2001 From: INSUN PYO Date: Fri, 15 Mar 2019 17:43:58 +0900 Subject: [PATCH 15/16] Fixes a problem that uses gdbus incorrectly When you repeatedly plug and unplug microUSB on TM1, you can find below journal log intermittently. /////////////////// journal message ////////////////////////////////////// Jan 01 15:16:17 localhost dbus[329]: [system] Rejected send message, 0 matched rules; type="error", sender=":1.26" (uid=451 pid=511 comm="") interface="(unset)" member="(unset)" error name="org.freedesktop.DBus.Error.UnknownMethod" requested_reply="0" destination=":1.32" privilege="(n/a)" (uid=451 pid=546 comm="") Jan 01 15:16:17 localhost dbus[329]: [system] Rejected send message, 0 matched rules; type="error", sender=":1.26" (uid=451 pid=511 comm="") interface="(unset)" member="(unset)" error name="org.freedesktop.DBus.Error.UnknownMethod" requested_reply="0" destination=":1.32" privilege="(n/a)" (uid=451 pid=546 comm="") Jan 01 15:16:17 localhost dbus[329]: [system] Rejected send message, 0 matched rules; type="error", sender=":1.26" (uid=451 pid=511 comm="") interface="(unset)" member="(unset)" error name="org.freedesktop.DBus.Error.UnknownMethod" requested_reply="0" destination=":1.32" privilege="(n/a)" (uid=451 pid=546 comm="") ////////////////////////////////////////////////////////////////////////// Change-Id: I56b440a7c2b8a680f83234be9d7c6e8859ef4d4f --- src/daemon/mm_resource_manager_daemon_dbus.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/daemon/mm_resource_manager_daemon_dbus.c b/src/daemon/mm_resource_manager_daemon_dbus.c index aeaf80d..9169a24 100755 --- a/src/daemon/mm_resource_manager_daemon_dbus.c +++ b/src/daemon/mm_resource_manager_daemon_dbus.c @@ -194,7 +194,7 @@ static gboolean on_get_conf(MMResourceManager *interface, mmresource_manager_complete_conf(interface, invocation, error, res_type_conf, res_cond_conf); - return FALSE; + return TRUE; } static gboolean on_create_handle(MMResourceManager *interface, @@ -210,7 +210,7 @@ static gboolean on_create_handle(MMResourceManager *interface, mmresource_manager_complete_create(interface, invocation, id, error); - return FALSE; + return TRUE; } static gboolean on_destroy_handle(MMResourceManager *interface, @@ -222,7 +222,7 @@ static gboolean on_destroy_handle(MMResourceManager *interface, error = _mmrm_dmn_dbus_destroy(id); mmresource_manager_complete_destroy(interface, invocation, error); - return FALSE; + return TRUE; } static gboolean on_commit_handle(MMResourceManager *interface, @@ -258,7 +258,7 @@ static gboolean on_commit_handle(MMResourceManager *interface, g_variant_iter_free(release_array); g_variant_iter_free(acquire_array); - return FALSE; + return TRUE; } static void on_bus_acquired(GDBusConnection *connection, const gchar *name, @@ -267,8 +267,7 @@ static void on_bus_acquired(GDBusConnection *connection, const gchar *name, GError* error = NULL; MM_RM_DEBUG("name of bus = %s, userID = %d", name, getuid()); - g_signal_connect(interface, "handle-conf", - G_CALLBACK(on_get_conf), NULL); + g_signal_connect(interface, "handle-conf", G_CALLBACK(on_get_conf), NULL); g_signal_connect(interface, "handle-create", G_CALLBACK(on_create_handle), NULL); g_signal_connect(interface, "handle-destroy", G_CALLBACK(on_destroy_handle), NULL); g_signal_connect(interface, "handle-commit", G_CALLBACK(on_commit_handle), NULL); -- 2.7.4 From 9c09f5641e2b44a06749a3ef53be98478b7901d7 Mon Sep 17 00:00:00 2001 From: YoungHun Kim Date: Wed, 13 Feb 2019 10:44:12 +0900 Subject: [PATCH 16/16] Resolve empty message of forking when glib debug enabled - Change the time to close pipe of forking by EPIPE - Change the mutex pair of resource handle Change-Id: Id2764bc8bf9cd6332c3f31c91d8e19c0ffcb4f3e --- packaging/mm-resource-manager.spec | 2 +- src/common/mm_resource_manager_utils.h | 10 ++++ .../backend/murphy/mm_resource_manager_mloop.c | 18 +++--- .../backend/murphy/mm_resource_manager_rset.c | 3 +- src/daemon/mm_resource_manager_daemon.c | 9 ++- src/daemon/mm_resource_manager_daemon_dbus.c | 69 +++++++++++----------- src/daemon/mm_resource_manager_daemon_dbus.h | 5 +- src/daemon/mm_resource_manager_daemon_priv.c | 9 +-- src/lib/mm_resource_manager_priv.c | 69 +++++++++------------- 9 files changed, 92 insertions(+), 102 deletions(-) diff --git a/packaging/mm-resource-manager.spec b/packaging/mm-resource-manager.spec index 5a5f908..42dcff6 100644 --- a/packaging/mm-resource-manager.spec +++ b/packaging/mm-resource-manager.spec @@ -1,6 +1,6 @@ Name: mm-resource-manager Summary: A Multimedia Resource Manager API -Version: 0.2.13 +Version: 0.2.14 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/common/mm_resource_manager_utils.h b/src/common/mm_resource_manager_utils.h index 0550767..b7d5d07 100644 --- a/src/common/mm_resource_manager_utils.h +++ b/src/common/mm_resource_manager_utils.h @@ -85,6 +85,16 @@ } \ } while (0) +#define MM_RM_UNLOCK2_RETVM_IF(expr, mtx, mtx2, val, fmt, arg...) \ + do { \ + if (expr) { \ + LOGE(FONT_COLOR_RED""fmt""FONT_COLOR_RESET, ##arg); \ + g_mutex_unlock(&mtx); \ + g_mutex_unlock(&mtx2); \ + return(val); \ + } \ + } while (0) + #define MM_RM_RETM_IF_E(expr, fmt, arg...) \ do { \ int err = expr; \ diff --git a/src/daemon/backend/murphy/mm_resource_manager_mloop.c b/src/daemon/backend/murphy/mm_resource_manager_mloop.c index 98deb9f..f697454 100644 --- a/src/daemon/backend/murphy/mm_resource_manager_mloop.c +++ b/src/daemon/backend/murphy/mm_resource_manager_mloop.c @@ -14,13 +14,9 @@ * limitations under the License. */ -#include -#include #include -#include - #include "lib/mm_resource_manager.h" -#include "common/mm_resource_manager_utils.h" +#include "daemon/mm_resource_manager_daemon_dbus.h" #include "daemon/backend/murphy/mm_resource_manager_mloop.h" static void __mm_resource_manager_mloop_state_callback(mrp_res_context_t *context, @@ -107,6 +103,8 @@ int _mm_resource_manager_mloop_create(mm_resource_manager_mloop_s **mrp) *mrp = handle; + _mmrm_dmn_notify_fork_done(); + MM_RM_INFO("Successfully performed mloop create"); return ret; @@ -139,10 +137,12 @@ int _mm_resource_manager_mloop_destroy(mm_resource_manager_mloop_s *mrp) g_main_loop_unref(mrp->m_loop); } - MM_RM_DEBUG("Joining worker thread..."); - g_thread_join(mrp->worker); - MM_RM_DEBUG("Joined to worker thread"); - mrp->worker = NULL; + if (mrp->worker) { + MM_RM_DEBUG("Joining worker thread..."); + g_thread_join(mrp->worker); + mrp->worker = NULL; + MM_RM_DEBUG("Joined to worker thread"); + } g_mutex_unlock(&mrp->lock); diff --git a/src/daemon/backend/murphy/mm_resource_manager_rset.c b/src/daemon/backend/murphy/mm_resource_manager_rset.c index d453800..0e2d511 100644 --- a/src/daemon/backend/murphy/mm_resource_manager_rset.c +++ b/src/daemon/backend/murphy/mm_resource_manager_rset.c @@ -272,8 +272,7 @@ static void _mm_resource_manager_rset_state_callback(mrp_res_context_t *cx, cons for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++) { res = mrp_res_get_resource_by_name(rs, _mm_resource_manager_get_res_str(i)); if (res == NULL) - MM_RM_INFO(" -- %s not present in resource set", - _mm_resource_manager_get_res_str(i)); + MM_RM_INFO(" -- %s not present in resource set", _mm_resource_manager_get_res_str(i)); else MM_RM_INFO(" -- resource name [%s] -> [%s]'", res->name, state_str[res->state]); } diff --git a/src/daemon/mm_resource_manager_daemon.c b/src/daemon/mm_resource_manager_daemon.c index 762f4ed..12b7782 100644 --- a/src/daemon/mm_resource_manager_daemon.c +++ b/src/daemon/mm_resource_manager_daemon.c @@ -47,7 +47,7 @@ typedef enum { static GMainLoop *main_loop; static gboolean restart = FALSE; -int notify_fd; +int notify_fd[2]; static gboolean fork_wait(void); @@ -78,12 +78,12 @@ static gboolean fork_wait(void) MM_RM_RETVM_IF((pid = fork()) < 0, FALSE, "Daemon fork failed"); if (pid != 0) { - close(fds[1]); /* Read in a string from the pipe */ MM_RM_RETVM_IF(read(fds[0], msg, sizeof(msg)) < 0, FALSE, "Failed to create pipe to get child status"); close(fds[0]); + close(fds[1]); /* Parent process closes up output side of pipe */ if (!strcmp(msg, MSG_DONE)) { @@ -95,9 +95,8 @@ static gboolean fork_wait(void) } } else if (pid == 0) { /* Child process closes up input side of pipe */ - close(fds[0]); - - notify_fd = fds[1]; + notify_fd[0] = fds[0]; + notify_fd[1] = fds[1]; } return TRUE; diff --git a/src/daemon/mm_resource_manager_daemon_dbus.c b/src/daemon/mm_resource_manager_daemon_dbus.c index 9169a24..cc54c1d 100755 --- a/src/daemon/mm_resource_manager_daemon_dbus.c +++ b/src/daemon/mm_resource_manager_daemon_dbus.c @@ -24,10 +24,11 @@ static MMResourceManager *interface; -extern int notify_fd; +extern int notify_fd[2]; static void __gv2c_array(GVariantIter *gv, mm_resource_manager_dmn_res_request_s **c); -static void _notify_fork_done(void); +static gboolean on_get_conf(MMResourceManager *interface, + GDBusMethodInvocation *invocation, gpointer user_data); static gboolean on_create_handle(MMResourceManager *interface, GDBusMethodInvocation *invocation, const gint app_class, gpointer user_data); @@ -47,6 +48,12 @@ int _mmrm_dmn_dbus_init() MM_RM_RETVM_IF(interface == NULL, MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION, "Interface cannot be created"); + + g_signal_connect(interface, "handle-conf", G_CALLBACK(on_get_conf), NULL); + g_signal_connect(interface, "handle-create", G_CALLBACK(on_create_handle), NULL); + g_signal_connect(interface, "handle-destroy", G_CALLBACK(on_destroy_handle), NULL); + g_signal_connect(interface, "handle-commit", G_CALLBACK(on_commit_handle), NULL); + g_bus_own_name(G_BUS_TYPE_SYSTEM, RMD_GDBUS_NAME, G_BUS_NAME_OWNER_FLAGS_NONE, on_bus_acquired, NULL, NULL, NULL, NULL); @@ -68,6 +75,11 @@ int _mmrm_dmn_dbus_get_conf(mm_resource_manager_res_volume **max_volume, mm_resource_manager_conf_s *conf; conf = mm_resource_manager_get_conf(); + + MM_RM_RETVM_IF(conf == NULL, + MM_RESOURCE_MANAGER_ERROR_INVALID_OPERATION, + "mm_resource_manager_conf is NULL"); + *max_volume = conf->max_volume; *cond_volume = &conf->condition_volume; @@ -130,7 +142,16 @@ int _mmrm_dmn_dbus_status_callback(mm_resource_manager_status_e status) return MM_RESOURCE_MANAGER_ERROR_NONE; } +void _mmrm_dmn_notify_fork_done(void) +{ + /* Send "string" through the output side of pipe */ + MM_RM_RETM_IF(write(notify_fd[1], MSG_DONE, strlen(MSG_DONE) + 1) < 0, + "Failed to notify parent process that child initialization is done"); + MM_RM_DEBUG("[%d] Notify parent process that child initialization is done", notify_fd[1]); + close(notify_fd[0]); + close(notify_fd[1]); +} static void __gv2c_array(GVariantIter *gv, mm_resource_manager_dmn_res_request_s **c) { @@ -145,23 +166,13 @@ static void __gv2c_array(GVariantIter *gv, mm_resource_manager_dmn_res_request_s *c = rs; } -void _notify_fork_done(void) -{ - /* Send "string" through the output side of pipe */ - MM_RM_RETM_IF(write(notify_fd, MSG_DONE, strlen(MSG_DONE) + 1) < 0, - "Failed to notify parent process that child initialization is done"); - - MM_RM_DEBUG("[%d] Notify parent process that child initialization is done", notify_fd); - close(notify_fd); -} - static gboolean on_get_conf(MMResourceManager *interface, GDBusMethodInvocation *invocation, gpointer user_data) { int i, j; gint error = 0; - mm_resource_manager_res_volume *max_volume; - mm_resource_manager_condition_volume_a *cond_volume; + mm_resource_manager_res_volume *max_volume = NULL; + mm_resource_manager_condition_volume_a *cond_volume = NULL; GVariantBuilder *res_type_builder; GVariantBuilder *res_cond_builder; GVariant *res_type_conf; @@ -170,29 +181,25 @@ static gboolean on_get_conf(MMResourceManager *interface, error = _mmrm_dmn_dbus_get_conf(&max_volume, &cond_volume); res_type_builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY); - for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++) { - g_variant_builder_add_value(res_type_builder, - g_variant_new("i", max_volume[i])); - } + for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++) + g_variant_builder_add_value(res_type_builder, g_variant_new("i", max_volume[i])); + res_type_conf = g_variant_builder_end(res_type_builder); g_variant_builder_unref(res_type_builder); res_type_builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY); for (i = 0; i < MM_RESOURCE_MANAGER_RES_TYPE_MAX; i++) { res_cond_builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY); - for (j = 0; j < MM_RESOURCE_MANAGER_RES_TYPE_COND_MAX; j++) { - g_variant_builder_add_value(res_cond_builder, - g_variant_new("i", cond_volume[i][j])); - } - g_variant_builder_add_value(res_type_builder, - g_variant_builder_end(res_cond_builder)); + for (j = 0; j < MM_RESOURCE_MANAGER_RES_TYPE_COND_MAX; j++) + g_variant_builder_add_value(res_cond_builder, g_variant_new("i", cond_volume[i][j])); + + g_variant_builder_add_value(res_type_builder, g_variant_builder_end(res_cond_builder)); g_variant_builder_unref(res_cond_builder); } res_cond_conf = g_variant_builder_end(res_type_builder); g_variant_builder_unref(res_type_builder); - mmresource_manager_complete_conf(interface, invocation, error, - res_type_conf, res_cond_conf); + mmresource_manager_complete_conf(interface, invocation, error, res_type_conf, res_cond_conf); return TRUE; } @@ -250,8 +257,7 @@ static gboolean on_commit_handle(MMResourceManager *interface, for (i = 0; i < acquire_len; i++) g_variant_builder_add_value(flags_builder, g_variant_new("b", flags[i])); not_acquired_flags = g_variant_builder_end(flags_builder); - mmresource_manager_complete_commit(interface, invocation, error, - not_acquired_flags); + mmresource_manager_complete_commit(interface, invocation, error, not_acquired_flags); g_free(flags); g_variant_builder_unref(flags_builder); @@ -267,16 +273,9 @@ static void on_bus_acquired(GDBusConnection *connection, const gchar *name, GError* error = NULL; MM_RM_DEBUG("name of bus = %s, userID = %d", name, getuid()); - g_signal_connect(interface, "handle-conf", G_CALLBACK(on_get_conf), NULL); - g_signal_connect(interface, "handle-create", G_CALLBACK(on_create_handle), NULL); - g_signal_connect(interface, "handle-destroy", G_CALLBACK(on_destroy_handle), NULL); - g_signal_connect(interface, "handle-commit", G_CALLBACK(on_commit_handle), NULL); - if (!g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(interface), connection, RMD_GDBUS_PATH, &error)) { MM_RM_ERROR("failed to export interface. msg : %s", error->message); g_error_free(error); } - - _notify_fork_done(); } diff --git a/src/daemon/mm_resource_manager_daemon_dbus.h b/src/daemon/mm_resource_manager_daemon_dbus.h index 8497cd0..aceaf82 100644 --- a/src/daemon/mm_resource_manager_daemon_dbus.h +++ b/src/daemon/mm_resource_manager_daemon_dbus.h @@ -23,8 +23,9 @@ #include -int _mmrm_dmn_dbus_init(); -int _mmrm_dmn_dbus_deinit(); +int _mmrm_dmn_dbus_init(void); +int _mmrm_dmn_dbus_deinit(void); +void _mmrm_dmn_notify_fork_done(void); int _mmrm_dmn_dbus_get_conf(mm_resource_manager_res_volume **max_volume, mm_resource_manager_condition_volume_a **cond_volume); int _mmrm_dmn_dbus_create(mm_resource_manager_app_class_e app_class, diff --git a/src/daemon/mm_resource_manager_daemon_priv.c b/src/daemon/mm_resource_manager_daemon_priv.c index b09efff..f90b8e4 100644 --- a/src/daemon/mm_resource_manager_daemon_priv.c +++ b/src/daemon/mm_resource_manager_daemon_priv.c @@ -776,8 +776,7 @@ static gboolean __wait_for_release_cb_sync(mm_resource_manager_id id) if (read_size == sizeof(recv_id)) { ret = id == recv_id; if (ret == FALSE) - MM_RM_ERROR("Sync is received from wrong client #%"PRIu64, - recv_id); + MM_RM_ERROR("Sync is received from wrong client #%"PRIu64, recv_id); /* * Wait POLLHUP to avoid situation when client sent last sync * through the pipe, but not already closed the pipe handle and @@ -785,12 +784,10 @@ static gboolean __wait_for_release_cb_sync(mm_resource_manager_id id) * the next sync. */ sync.revents = 0; - if (poll(&sync, 1, RELEASE_CB_SYNC_TIMEOUT * 1000) == 0 || - (sync.revents & (POLLHUP | POLLERR)) == 0) + if (poll(&sync, 1, RELEASE_CB_SYNC_TIMEOUT * 1000) == 0 || (sync.revents & (POLLHUP | POLLERR)) == 0) MM_RM_ERROR("The client didn't close the FIFO"); } else { - MM_RM_ERROR("Read is failed (revents=%hd,read_size=%zd)", - sync.revents, read_size); + MM_RM_ERROR("Read is failed (revents=%hd,read_size=%zd)", sync.revents, read_size); ret = FALSE; } } diff --git a/src/lib/mm_resource_manager_priv.c b/src/lib/mm_resource_manager_priv.c index 1a8dc62..5390dbb 100644 --- a/src/lib/mm_resource_manager_priv.c +++ b/src/lib/mm_resource_manager_priv.c @@ -223,7 +223,7 @@ int _mm_resource_manager_destroy(mm_resource_manager_h rm) g_mutex_lock(&handle->resources_lock); ret = __dbus_destroy(handle); if (ret != MM_RESOURCE_MANAGER_ERROR_NONE) - MM_RM_ERROR("Dbus destroy request failed"); + MM_RM_ERROR("Dbus destroy request failed 0x%x", ret); __destroy_dispatcher(handle); @@ -251,11 +251,10 @@ int _mm_resource_manager_mark_for_acquire( g_mutex_lock(&handles_lock); MM_RESOURCE_MANAGER_CHECK(handle); g_mutex_lock(&handle->resources_lock); - g_mutex_unlock(&handles_lock); ret = __create_resource(handle, type, volume, &resource); - MM_RM_UNLOCK_RETVM_IF(ret != MM_RESOURCE_MANAGER_ERROR_NONE, - handle->resources_lock, ret, "Resource cannot be created"); + MM_RM_UNLOCK2_RETVM_IF(ret != MM_RESOURCE_MANAGER_ERROR_NONE, + handle->resources_lock, handles_lock, ret, "Resource cannot be created"); g_ptr_array_add(handle->resources, resource); *resource_h = resource; @@ -264,6 +263,7 @@ int _mm_resource_manager_mark_for_acquire( "resource manager #%"PRIu64, *resource_h, type, volume, _mm_rm_hash64(handle->id)); g_mutex_unlock(&handle->resources_lock); + g_mutex_unlock(&handles_lock); return ret; } @@ -282,11 +282,10 @@ int _mm_resource_manager_resize_marked(mm_resource_manager_h rm, g_mutex_lock(&handles_lock); MM_RESOURCE_MANAGER_CHECK(handle); g_mutex_lock(&handle->resources_lock); - g_mutex_unlock(&handles_lock); i = __get_resource_index(handle, resource); - MM_RM_UNLOCK_RETVM_IF(i == MM_RESOURCE_MANAGER_RES_NOT_FOUND, - handle->resources_lock, + MM_RM_UNLOCK2_RETVM_IF(i == MM_RESOURCE_MANAGER_RES_NOT_FOUND, + handle->resources_lock, handles_lock, MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, "Invalid resource handle"); if (new_volume == resource->volume) { @@ -303,8 +302,8 @@ int _mm_resource_manager_resize_marked(mm_resource_manager_h rm, case MM_RESOURCE_MANAGER_RES_STATE_FOR_ACQUIRE: if (add_volume > 0) { ret = __check_resource(handle, resource->type, add_volume); - MM_RM_UNLOCK_RETVM_IF(ret != MM_RESOURCE_MANAGER_ERROR_NONE, - handle->resources_lock, ret, "Resource check failed"); + MM_RM_UNLOCK2_RETVM_IF(ret != MM_RESOURCE_MANAGER_ERROR_NONE, + handle->resources_lock, handles_lock, ret, "Resource check failed"); } resource->volume = new_volume; break; @@ -312,8 +311,8 @@ int _mm_resource_manager_resize_marked(mm_resource_manager_h rm, case MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE: case MM_RESOURCE_MANAGER_RES_STATE_ACQUIRED: ret = __create_resource(handle, resource->type, add_volume, &tmp_resource); - MM_RM_UNLOCK_RETVM_IF(ret != MM_RESOURCE_MANAGER_ERROR_NONE, - handle->resources_lock, ret, "Resource cannot be created"); + MM_RM_UNLOCK2_RETVM_IF(ret != MM_RESOURCE_MANAGER_ERROR_NONE, + handle->resources_lock, handles_lock, ret, "Resource cannot be created"); tmp_resource->volume = resource->volume; tmp_resource->state = MM_RESOURCE_MANAGER_RES_STATE_FOR_RELEASE; @@ -329,6 +328,7 @@ int _mm_resource_manager_resize_marked(mm_resource_manager_h rm, MM_RM_INFO("Resource %p is resized for acquire in resource manager #%"PRIu64, resource_h, _mm_rm_hash64(handle->id)); g_mutex_unlock(&handle->resources_lock); + g_mutex_unlock(&handles_lock); return ret; } @@ -343,11 +343,10 @@ int _mm_resource_manager_mark_for_release(mm_resource_manager_h rm, g_mutex_lock(&handles_lock); MM_RESOURCE_MANAGER_CHECK(handle); g_mutex_lock(&handle->resources_lock); - g_mutex_unlock(&handles_lock); i = __get_resource_index(handle, resource); - MM_RM_UNLOCK_RETVM_IF(i == MM_RESOURCE_MANAGER_RES_NOT_FOUND, - handle->resources_lock, + MM_RM_UNLOCK2_RETVM_IF(i == MM_RESOURCE_MANAGER_RES_NOT_FOUND, + handle->resources_lock, handles_lock, MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, "Invalid resource handle"); @@ -356,6 +355,7 @@ int _mm_resource_manager_mark_for_release(mm_resource_manager_h rm, MM_RM_INFO("Resource %p is marked for release in resource manager #%"PRIu64, resource_h, _mm_rm_hash64(handle->id)); g_mutex_unlock(&handle->resources_lock); + g_mutex_unlock(&handles_lock); return MM_RESOURCE_MANAGER_ERROR_NONE; } @@ -368,18 +368,17 @@ int _mm_resource_manager_mark_all_for_release(mm_resource_manager_h rm) g_mutex_lock(&handles_lock); MM_RESOURCE_MANAGER_CHECK(handle); g_mutex_lock(&handle->resources_lock); - g_mutex_unlock(&handles_lock); for (i = 0; i < handle->resources->len; i++) { if (!__mark_resource_for_release(handle->resources, i, - (mm_resource_manager_res_p) handle->resources->pdata[i])) { + (mm_resource_manager_res_p) handle->resources->pdata[i])) i--; - } } MM_RM_INFO("All resources are marked for release in resource manager #%"PRIu64, _mm_rm_hash64(handle->id)); g_mutex_unlock(&handle->resources_lock); + g_mutex_unlock(&handles_lock); return MM_RESOURCE_MANAGER_ERROR_NONE; } @@ -395,11 +394,10 @@ int _mm_resource_manager_get_resource_info(mm_resource_manager_h rm, g_mutex_lock(&handles_lock); MM_RESOURCE_MANAGER_CHECK(handle); g_mutex_lock(&handle->resources_lock); - g_mutex_unlock(&handles_lock); i = __get_resource_index(handle, resource); - MM_RM_UNLOCK_RETVM_IF(i == MM_RESOURCE_MANAGER_RES_NOT_FOUND, - handle->resources_lock, + MM_RM_UNLOCK2_RETVM_IF(i == MM_RESOURCE_MANAGER_RES_NOT_FOUND, + handle->resources_lock, handles_lock, MM_RESOURCE_MANAGER_ERROR_INVALID_PARAMETER, "Invalid resource handle"); @@ -410,6 +408,7 @@ int _mm_resource_manager_get_resource_info(mm_resource_manager_h rm, MM_RM_INFO("Info structure of resource %p in resource manager #%"PRIu64" is filled", resource_h, _mm_rm_hash64(handle->id)); g_mutex_unlock(&handle->resources_lock); + g_mutex_unlock(&handles_lock); return MM_RESOURCE_MANAGER_ERROR_NONE; } @@ -422,16 +421,15 @@ int _mm_resource_manager_commit(mm_resource_manager_h rm) g_mutex_lock(&handles_lock); MM_RESOURCE_MANAGER_CHECK(handle); g_mutex_lock(&handle->resources_lock); - g_mutex_unlock(&handles_lock); ret = __dbus_commit(handle); - if (ret == MM_RESOURCE_MANAGER_ERROR_NONE) { + if (ret == MM_RESOURCE_MANAGER_ERROR_NONE) MM_RM_INFO("Changes in resource manager #%"PRIu64" have been committed successfully", _mm_rm_hash64(handle->id)); - } else { + else MM_RM_ERROR("Dbus commit request failed"); - } g_mutex_unlock(&handle->resources_lock); + g_mutex_unlock(&handles_lock); return ret; } @@ -444,11 +442,11 @@ int _mm_resource_manager_set_status_cb(mm_resource_manager_h rm, g_mutex_lock(&handles_lock); MM_RESOURCE_MANAGER_CHECK(handle); g_mutex_lock(&handle->resources_lock); - g_mutex_unlock(&handles_lock); handle->status_cb.cb = cb; handle->status_cb.user_data = user_data; g_mutex_unlock(&handle->resources_lock); + g_mutex_unlock(&handles_lock); MM_RM_INFO("Status callback %p in resource manager #%"PRIu64" is set", cb, _mm_rm_hash64(handle->id)); @@ -504,7 +502,6 @@ void __mm_resource_manager_release_callback(mm_resource_manager_s *handle, MM_RM_HASH64(handle_id); if (handle_id == id) { g_mutex_lock(&handle->resources_lock); - g_mutex_unlock(&handles_lock); for (j = 0; j < handle->resources->len; j++) { resource = (mm_resource_manager_res_s*)handle->resources->pdata[j]; if (resource->type == type && resource->volume == volume) { @@ -531,8 +528,6 @@ void __mm_resource_manager_release_callback(mm_resource_manager_s *handle, MM_RM_ERROR("Resources cannot be released after release cb"); } } - } else { - g_mutex_unlock(&handles_lock); } } @@ -540,7 +535,6 @@ void __mm_resource_manager_status_callback(mm_resource_manager_s *handle, mm_resource_manager_status_e status) { g_mutex_lock(&handle->resources_lock); - g_mutex_unlock(&handles_lock); if (handle->status_cb.cb) { ((mm_resource_manager_status_cb)handle->status_cb.cb)(handle, status, handle->status_cb.user_data); @@ -807,8 +801,7 @@ static int __dbus_destroy(mm_resource_manager_s *handle) NULL, &error); MM_RM_RET_IF_GERR(error, "DBus destroy msg cannot be sent"); - MM_RM_DEBUG("Destroy for id - #%"PRIu64" returned error - %d", - _mm_rm_hash64(handle->id), rm_error); + MM_RM_DEBUG("Destroy for id - #%"PRIu64" returned error - %d", _mm_rm_hash64(handle->id), rm_error); return MM_RESOURCE_MANAGER_ERROR_NONE; } @@ -845,7 +838,7 @@ static int __dbus_commit(mm_resource_manager_s *handle) release_num++; break; default: - ; + break; } } @@ -914,7 +907,6 @@ static void __dbus_release_callback(MMResourceManager *object, guint64 arg_id, gint arg_resource_type, gint arg_volume) { mm_resource_manager_s *handle; - gboolean unlock = TRUE; int i; g_mutex_lock(&handles_lock); @@ -923,19 +915,15 @@ static void __dbus_release_callback(MMResourceManager *object, guint64 arg_id, if (handle->dbus_proxy == object) { __mm_resource_manager_release_callback(handle, arg_id, arg_resource_type, arg_volume); - unlock = FALSE; break; } } - - if (unlock) - g_mutex_unlock(&handles_lock); + g_mutex_unlock(&handles_lock); } static void __dbus_status_callback(MMResourceManager *object, gint arg_status) { mm_resource_manager_s *handle; - gboolean unlock = TRUE; int i; g_mutex_lock(&handles_lock); @@ -943,13 +931,10 @@ static void __dbus_status_callback(MMResourceManager *object, gint arg_status) handle = (mm_resource_manager_s*)handles->pdata[i]; if (handle->dbus_proxy == object) { __mm_resource_manager_status_callback(handle, arg_status); - unlock = FALSE; break; } } - - if (unlock) - g_mutex_unlock(&handles_lock); + g_mutex_unlock(&handles_lock); } static gpointer __dispatcher_thread(gpointer user_data) -- 2.7.4