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();
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",
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)