Make sure the focus loop is running within _focus_init_context() 80/119180/6 accepted/tizen/3.0/common/20170320.130433 accepted/tizen/3.0/ivi/20170320.080507 accepted/tizen/3.0/mobile/20170320.074924 accepted/tizen/3.0/tv/20170320.075841 accepted/tizen/3.0/wearable/20170320.080129 submit/tizen_3.0/20170317.034449
authorSangchul Lee <sc11.lee@samsung.com>
Thu, 16 Mar 2017 02:23:56 +0000 (11:23 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Thu, 16 Mar 2017 05:02:30 +0000 (14:02 +0900)
[Version] 0.10.100
[Profile] Common
[Issue Type] Enhancement

Change-Id: Icf003ecc57c716ec3430f1cbd3a5e49e9f10a708
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
mm_sound_client.c
packaging/libmm-sound.spec

index 8ee3d5d..b8551ef 100644 (file)
@@ -1562,8 +1562,33 @@ static void _focus_deinit_callback(int index, bool is_for_watching)
        debug_fleave();
 }
 
+#define INTERVAL_MS 20
+static int _focus_loop_is_running_timed_wait(GMainLoop *focus_loop, int timeout_ms)
+{
+       int reduced_time_ms = timeout_ms;
+       if (!focus_loop || timeout_ms < 0) {
+               debug_error("invalid argument, focus_loop(%p), timeout_ms(%d)", focus_loop, timeout_ms);
+               return MM_ERROR_INVALID_ARGUMENT;
+       }
+
+       do {
+               if (g_main_loop_is_running(focus_loop))
+                       return MM_ERROR_NONE;
+
+               usleep(INTERVAL_MS * 1000);
+               if (reduced_time_ms < timeout_ms)
+                       debug_warning("reduced_time_ms(%d)", reduced_time_ms);
+       } while ((reduced_time_ms -= INTERVAL_MS) >= 0);
+
+       debug_error("focus_loop is not running for timeout_ms(%d), focus_loop(%p) ", timeout_ms, focus_loop);
+
+       return MM_ERROR_SOUND_INTERNAL;
+}
+
+#define LOOP_RUNNING_WAIT_TIME_MS 200
 static int _focus_init_context(int index)
 {
+       int ret = MM_ERROR_NONE;
        GMainContext *focus_context;
 
        debug_fenter();
@@ -1578,7 +1603,7 @@ static int _focus_init_context(int index)
        g_main_context_unref(focus_context);
        if (g_focus_sound_handle[index].focus_loop == NULL) {
                debug_error("could not create mainloop..");
-               return MM_ERROR_SOUND_INTERNAL;
+               goto ERROR;
        }
 
        g_focus_sound_handle[index].focus_cb_thread = g_thread_new("focus-cb-thread",
@@ -1586,16 +1611,27 @@ static int _focus_init_context(int index)
                                                                        g_focus_sound_handle[index].focus_loop);
        if (g_focus_sound_handle[index].focus_cb_thread == NULL) {
                debug_error("could not create thread..");
-               g_main_loop_unref(g_focus_sound_handle[index].focus_loop);
-               return MM_ERROR_SOUND_INTERNAL;
+               goto ERROR;
        }
 
        debug_warning("focus cb thread[%p] with mainloop[%p] is created for index(%d)",
                                g_focus_sound_handle[index].focus_cb_thread, g_focus_sound_handle[index].focus_loop, index);
 
+       if ((ret = _focus_loop_is_running_timed_wait(g_focus_sound_handle[index].focus_loop, LOOP_RUNNING_WAIT_TIME_MS))) {
+               debug_error("failed to _focus_loop_is_running_timed_wait(), ret[0x%x]", ret);
+               goto ERROR;
+       }
+
        debug_fleave();
 
        return MM_ERROR_NONE;
+
+ERROR:
+       if (g_focus_sound_handle[index].focus_loop) {
+               g_main_loop_unref(g_focus_sound_handle[index].focus_loop);
+               g_focus_sound_handle[index].focus_loop = NULL;
+       }
+       return MM_ERROR_SOUND_INTERNAL;
 }
 
 static void _focus_deinit_context(int index)
index ae893f7..a7a93ed 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmm-sound
 Summary:    MMSound Package contains client lib and sound_server binary
-Version:    0.10.99
+Version:    0.10.100
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0