summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolodymyr Brynza <v.brynza@samsung.com>2016-12-19 22:25:21 +0200
committerVolodymyr Brynza <v.brynza@samsung.com>2016-12-19 22:25:21 +0200
commitbf6cef22e23cf170f1e9cf7216ee8c83b654eca7 (patch)
treec4e7410a21899a5d0fcb10302f6ca4c29c44abad
parent0df49803262343082d468e5f47ab278ca6d06f58 (diff)
downloadlibmm-player-bf6cef22e23cf170f1e9cf7216ee8c83b654eca7.tar.gz
libmm-player-bf6cef22e23cf170f1e9cf7216ee8c83b654eca7.tar.bz2
libmm-player-bf6cef22e23cf170f1e9cf7216ee8c83b654eca7.zip
Move thread creation logic to Murphy to prevent thread lock up
Change-Id: I9c8e41bf66bef9f7a9094d8cbd604cb91c0d5a86 Signed-off-by: Volodymyr Brynza <v.brynza@samsung.com>
-rw-r--r--src/include/mm_player_resource.h2
-rw-r--r--src/mm_player_resource.c36
2 files changed, 14 insertions, 24 deletions
diff --git a/src/include/mm_player_resource.h b/src/include/mm_player_resource.h
index 88d383a..085a65f 100644
--- a/src/include/mm_player_resource.h
+++ b/src/include/mm_player_resource.h
@@ -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);
diff --git a/src/mm_player_resource.c b/src/mm_player_resource.c
index 5474c0e..c886b0c 100644
--- a/src/mm_player_resource.c
+++ b/src/mm_player_resource.c
@@ -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;
}