From: Volodymyr Brynza Date: Mon, 19 Dec 2016 20:21:13 +0000 (+0200) Subject: Move thread creation logic to Murphy to prevent thread lock up X-Git-Tag: accepted/tizen/common/20161220.191027^0 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fmultimedia%2Flibmm-camcorder.git;a=commitdiff_plain;h=f7cfb190f0378f1fb04697738c903d9542bd5d68 Move thread creation logic to Murphy to prevent thread lock up Change-Id: Ib3ac65c6679a8eb386e827d930ea54338af9010c Signed-off-by: Volodymyr Brynza --- diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index 08c7e33..88d1767 100644 --- a/packaging/libmm-camcorder.spec +++ b/packaging/libmm-camcorder.spec @@ -1,6 +1,6 @@ Name: libmm-camcorder Summary: Camera and recorder library -Version: 0.10.98 +Version: 0.10.99 Release: 0 Group: Multimedia/Libraries License: Apache-2.0 diff --git a/src/include/mm_camcorder_resource.h b/src/include/mm_camcorder_resource.h index e5e685e..d399a1c 100644 --- a/src/include/mm_camcorder_resource.h +++ b/src/include/mm_camcorder_resource.h @@ -42,8 +42,6 @@ typedef struct { void *user_data; int acquire_count; int acquire_remain; - GThread *starter; - GMainLoop *mrp_loop; } MMCamcorderResourceManager; int _mmcamcorder_resource_manager_init(MMCamcorderResourceManager *resource_manager, void *user_data); diff --git a/src/mm_camcorder_resource.c b/src/mm_camcorder_resource.c index 5dde52d..8ae077e 100644 --- a/src/mm_camcorder_resource.c +++ b/src/mm_camcorder_resource.c @@ -318,28 +318,34 @@ static int __mmcamcorder_resource_set_release_cb(MMCamcorderResourceManager *res return ret; } -static gpointer __mmcamcorder_launch_glib_murphy_loop(void *user_data) +int _mmcamcorder_resource_manager_init(MMCamcorderResourceManager *resource_manager, void *user_data) { - MMCamcorderResourceManager *resource_manager= (MMCamcorderResourceManager *)user_data; + GMainContext *mrp_ctx = NULL; + GMainLoop *mrp_loop = NULL; - _mmcam_dbg_log("Run mrp_loop"); + MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); - g_main_loop_run(resource_manager->mrp_loop); + mrp_ctx = g_main_context_new(); + if (!mrp_ctx) { + _mmcam_dbg_err("failed to get create glib context for mrp"); + return MM_ERROR_RESOURCE_INTERNAL; + } - _mmcam_dbg_log("Murphy glib loop exit"); + mrp_loop = g_main_loop_new(mrp_ctx, TRUE); - return NULL; -} + g_main_context_unref(mrp_ctx); + mrp_ctx = NULL; -int _mmcamcorder_resource_manager_init(MMCamcorderResourceManager *resource_manager, void *user_data) -{ - MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager); + if (!mrp_loop) { + _mmcam_dbg_err("failed to get create glib loop for mrp"); + return MM_ERROR_RESOURCE_INTERNAL; + } + + resource_manager->mloop = mrp_mainloop_glib_get(mrp_loop); + + g_main_loop_unref(mrp_loop); + mrp_loop = NULL; - GMainContext *mrp_ctx = g_main_context_new(); - resource_manager->mrp_loop = g_main_loop_new(mrp_ctx, TRUE); - resource_manager->mloop = mrp_mainloop_glib_get(resource_manager->mrp_loop); - resource_manager->starter = g_thread_new(NULL, (GThreadFunc)__mmcamcorder_launch_glib_murphy_loop, resource_manager); - g_main_context_unref(mrp_ctx); if (!resource_manager->mloop) { _mmcam_dbg_err("failed to get mainloop for mrp"); return MM_ERROR_RESOURCE_INTERNAL; @@ -348,8 +354,10 @@ int _mmcamcorder_resource_manager_init(MMCamcorderResourceManager *resource_mana resource_manager->context = mrp_res_create(resource_manager->mloop, __mmcamcorder_resource_state_callback, user_data); if (!resource_manager->context) { _mmcam_dbg_err("could not get context for mrp"); + mrp_mainloop_destroy(resource_manager->mloop); resource_manager->mloop = NULL; + return MM_ERROR_RESOURCE_INTERNAL; } @@ -444,20 +452,9 @@ int _mmcamcorder_resource_manager_deinit(MMCamcorderResourceManager *resource_ma resource_manager->context = NULL; } - if (resource_manager->mrp_loop) { - g_main_loop_quit(resource_manager->mrp_loop); - g_main_loop_unref(resource_manager->mrp_loop); - resource_manager->mrp_loop = NULL; - } - - if (resource_manager->starter) { - g_thread_join(resource_manager->starter); - g_thread_unref(resource_manager->starter); - resource_manager->starter = NULL; - } - if (resource_manager->mloop) { _mmcam_dbg_log("destroy resource mainloop"); + mrp_mainloop_quit(resource_manager->mloop, 0); mrp_mainloop_destroy(resource_manager->mloop); resource_manager->mloop = NULL; }