Move thread creation logic to Murphy to prevent thread lock up 82/106082/1 accepted/tizen/3.0/common/20161221.181324 accepted/tizen/3.0/ivi/20161221.011017 accepted/tizen/3.0/mobile/20161221.011628 accepted/tizen/3.0/tv/20161221.010803 accepted/tizen/3.0/wearable/20161221.011137 submit/tizen_3.0/20161220.100802
authorVolodymyr Brynza <v.brynza@samsung.com>
Mon, 19 Dec 2016 20:25:21 +0000 (22:25 +0200)
committereunhae choi <eunhae1.choi@samsung.com>
Tue, 20 Dec 2016 10:20:24 +0000 (02:20 -0800)
Change-Id: I9c8e41bf66bef9f7a9094d8cbd604cb91c0d5a86
Signed-off-by: Volodymyr Brynza <v.brynza@samsung.com>
(cherry picked from commit bf6cef22e23cf170f1e9cf7216ee8c83b654eca7)

src/include/mm_player_resource.h
src/mm_player_resource.c

index 88d383a..085a65f 100644 (file)
@@ -64,8 +64,6 @@ typedef struct {
        bool by_rm_cb;
        GCond cond;
        GMutex lock;
-       GThread *starter;
-       GMainLoop *mrp_loop;
 } MMPlayerResourceManager;
 
 int _mmplayer_resource_manager_init(MMPlayerResourceManager *resource_manager, void *user_data);
index 5474c0e..c886b0c 100644 (file)
@@ -294,25 +294,26 @@ static int set_resource_release_cb(MMPlayerResourceManager *resource_manager)
        return ret;
 }
 
-static gpointer __mmplayer_launch_glib_murphy_loop(void *user_data)
-{
-       MMPlayerResourceManager *resource_manager= (MMPlayerResourceManager *)user_data;
-       LOGI("Run mrp_loop");
-       g_main_loop_run(resource_manager->mrp_loop);
-       LOGI("Murphy glib loop exit");
-       return NULL;
-}
-
 int _mmplayer_resource_manager_init(MMPlayerResourceManager *resource_manager, void *user_data)
 {
        MMPLAYER_FENTER();
        MMPLAYER_CHECK_RESOURCE_MANAGER_INSTANCE(resource_manager);
 
        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)__mmplayer_launch_glib_murphy_loop, resource_manager);
+       if (!mrp_ctx) {
+               LOGE("- could not create main context for resource manager\n");
+               return MM_ERROR_RESOURCE_INTERNAL;
+       }
+
+       GMainLoop *mrp_loop = g_main_loop_new(mrp_ctx, TRUE);
        g_main_context_unref(mrp_ctx);
+       if (!mrp_loop) {
+               LOGE("- could not create glib mainloop for resource manager\n");
+               return MM_ERROR_RESOURCE_INTERNAL;
+       }
+
+       resource_manager->mloop = mrp_mainloop_glib_get(mrp_loop);
+       g_main_loop_unref(mrp_loop);
        if (resource_manager->mloop) {
                resource_manager->context = mrp_res_create(resource_manager->mloop, mrp_state_callback, user_data);
                if (resource_manager->context == NULL) {
@@ -490,17 +491,8 @@ int _mmplayer_resource_manager_deinit(MMPlayerResourceManager *resource_manager)
                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;
-       }
-
-       g_thread_join(resource_manager->starter);
-       g_thread_unref(resource_manager->starter);
-       resource_manager->starter = NULL;
-
        if (resource_manager->mloop) {
+               mrp_mainloop_quit(resource_manager->mloop, 0);
                mrp_mainloop_destroy(resource_manager->mloop);
                resource_manager->mloop = NULL;
        }