Move thread creation logic to Murphy to prevent thread lock up 87/100287/4 accepted/tizen/common/20161220.191027 accepted/tizen/ivi/20161220.223830 accepted/tizen/mobile/20161220.223702 accepted/tizen/tv/20161220.223735 accepted/tizen/unified/20170309.033358 accepted/tizen/wearable/20161220.223801 submit/tizen/20161220.104958 submit/tizen_unified/20170308.100408
authorVolodymyr Brynza <v.brynza@samsung.com>
Mon, 19 Dec 2016 20:21:13 +0000 (22:21 +0200)
committerJeongmo Yang <jm80.yang@samsung.com>
Tue, 20 Dec 2016 08:20:41 +0000 (17:20 +0900)
Change-Id: Ib3ac65c6679a8eb386e827d930ea54338af9010c
Signed-off-by: Volodymyr Brynza <v.brynza@samsung.com>
packaging/libmm-camcorder.spec
src/include/mm_camcorder_resource.h
src/mm_camcorder_resource.c

index 08c7e33..88d1767 100644 (file)
@@ -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
index e5e685e..d399a1c 100644 (file)
@@ -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);
index 5dde52d..8ae077e 100644 (file)
@@ -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;
        }