Move murphy client main loop to new context 50/94850/5
authorVolodymyr Brynza <v.brynza@samsung.com>
Mon, 7 Nov 2016 07:35:25 +0000 (09:35 +0200)
committerJeongmo Yang <jm80.yang@samsung.com>
Thu, 10 Nov 2016 00:54:15 +0000 (09:54 +0900)
Change-Id: Ib9be1daad1bd97b15c3af4ee9ee072960bc9c6b1
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 c67d306..b6de7e4 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-camcorder
 Summary:    Camera and recorder library
-Version:    0.10.90
+Version:    0.10.91
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0
index d399a1c..e5e685e 100644 (file)
@@ -42,6 +42,8 @@ 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 3c15e0a..af32408 100644 (file)
@@ -318,11 +318,24 @@ static int __mmcamcorder_resource_set_release_cb(MMCamcorderResourceManager *res
        return ret;
 }
 
+static gpointer __mmcamcorder_launch_glib_murphy_loop(void *user_data)
+{
+       LOGI("Run mrp_loop");
+       MMCamcorderResourceManager *resource_manager= (MMCamcorderResourceManager *)user_data;
+       g_main_loop_run(resource_manager->mrp_loop);
+       LOGI("Murphy glib loop exit");
+       return NULL;
+}
+
 int _mmcamcorder_resource_manager_init(MMCamcorderResourceManager *resource_manager, void *user_data)
 {
        MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager);
 
-       resource_manager->mloop = mrp_mainloop_glib_get(g_main_loop_new(NULL, TRUE));
+       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;
@@ -425,6 +438,11 @@ int _mmcamcorder_resource_manager_deinit(MMCamcorderResourceManager *resource_ma
                mrp_res_destroy(resource_manager->context);
                resource_manager->context = NULL;
        }
+       if (resource_manager->mrp_loop) {
+               g_main_loop_quit(resource_manager->mrp_loop);
+               resource_manager->mrp_loop = NULL;
+       }
+       g_thread_join(resource_manager->starter);
        if (resource_manager->mloop) {
                _mmcam_dbg_log("destroy resource mainloop");
                mrp_mainloop_destroy(resource_manager->mloop);