From 03041f41755720384ba66fe805030377316115d6 Mon Sep 17 00:00:00 2001 From: Volodymyr Brynza Date: Mon, 7 Nov 2016 09:35:25 +0200 Subject: [PATCH] Move murphy client main loop to new context Change-Id: Ib9be1daad1bd97b15c3af4ee9ee072960bc9c6b1 Signed-off-by: Volodymyr Brynza --- packaging/libmm-camcorder.spec | 2 +- src/include/mm_camcorder_resource.h | 2 ++ src/mm_camcorder_resource.c | 20 +++++++++++++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packaging/libmm-camcorder.spec b/packaging/libmm-camcorder.spec index c67d306..b6de7e4 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.90 +Version: 0.10.91 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 d399a1c..e5e685e 100644 --- a/src/include/mm_camcorder_resource.h +++ b/src/include/mm_camcorder_resource.h @@ -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); diff --git a/src/mm_camcorder_resource.c b/src/mm_camcorder_resource.c index 3c15e0a..af32408 100644 --- a/src/mm_camcorder_resource.c +++ b/src/mm_camcorder_resource.c @@ -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); -- 2.7.4