Move thread creation logic to Murphy to prevent thread lock up
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_resource.c
index baea539..8ae077e 100644 (file)
@@ -257,8 +257,9 @@ static void __mmcamcorder_resource_release_cb(mrp_res_context_t *cx, const mrp_r
 int _mmcamcorder_resource_create_resource_set(MMCamcorderResourceManager *resource_manager)
 {
        if (resource_manager->rset) {
-               _mmcam_dbg_err(" - resource set was already created");
-               return MM_ERROR_RESOURCE_INVALID_STATE;
+               _mmcam_dbg_warn(" - resource set was already created, delete it");
+               mrp_res_delete_resource_set(resource_manager->rset);
+               resource_manager->rset = NULL;
        }
 
        resource_manager->rset = mrp_res_create_resource_set(resource_manager->context,
@@ -319,9 +320,32 @@ static int __mmcamcorder_resource_set_release_cb(MMCamcorderResourceManager *res
 
 int _mmcamcorder_resource_manager_init(MMCamcorderResourceManager *resource_manager, void *user_data)
 {
+       GMainContext *mrp_ctx = NULL;
+       GMainLoop *mrp_loop = NULL;
+
        MMCAMCORDER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager);
 
-       resource_manager->mloop = mrp_mainloop_glib_get(g_main_loop_new(NULL, TRUE));
+       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;
+       }
+
+       mrp_loop = g_main_loop_new(mrp_ctx, TRUE);
+
+       g_main_context_unref(mrp_ctx);
+       mrp_ctx = NULL;
+
+       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;
+
        if (!resource_manager->mloop) {
                _mmcam_dbg_err("failed to get mainloop for mrp");
                return MM_ERROR_RESOURCE_INTERNAL;
@@ -330,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;
        }
 
@@ -419,13 +445,16 @@ int _mmcamcorder_resource_manager_deinit(MMCamcorderResourceManager *resource_ma
                mrp_res_delete_resource_set(resource_manager->rset);
                resource_manager->rset = NULL;
        }
+
        if (resource_manager->context) {
                _mmcam_dbg_log("destroy resource context");
                mrp_res_destroy(resource_manager->context);
                resource_manager->context = 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;
        }