Fixed thread to timer for prepare 13/218313/9
authorsungrae jo <seongrae.jo@samsung.com>
Thu, 21 Nov 2019 07:55:37 +0000 (16:55 +0900)
committersungrae jo <seongrae.jo@samsung.com>
Fri, 22 Nov 2019 01:49:03 +0000 (10:49 +0900)
Change-Id: Iab3f31b2c345cf81a7e3b6f70b60c6b71211debe
Signed-off-by: sungrae jo <seongrae.jo@samsung.com>
client/vc_mgr.c

index 921f04f..bb411a5 100644 (file)
@@ -44,6 +44,8 @@
 #define VC_MANAGER_CONFIG_HANDLE       100000
 
 static Ecore_Timer* g_m_connect_timer = NULL;
+static Ecore_Idler* g_m_connect_idler = NULL;
+static int g_retry_connect_count = 0;
 
 static Ecore_Timer* g_m_set_volume_timer = NULL;
 
@@ -77,7 +79,6 @@ static vc_audio_channel_e g_feedback_audio_channel = 0;
 static vc_audio_type_e g_feedback_audio_type = 0;
 static Ecore_Thread* g_feedback_thread = NULL;
 
-static Ecore_Thread* g_mgr_thread = NULL;
 
 static Eina_Bool __vc_mgr_notify_state_changed(void *data);
 static void __vc_mgr_notify_error(void *data);
@@ -358,6 +359,11 @@ int vc_mgr_deinitialize(void)
                        ecore_timer_del(g_m_connect_timer);
                        g_m_connect_timer = NULL;
                }
+               if (g_m_connect_idler) {
+                       SLOG(LOG_DEBUG, TAG_VCM, "Connect idler is deleted");
+                       ecore_idler_del(g_m_connect_idler);
+                       g_m_connect_idler = NULL;
+               }
 
                vc_config_mgr_unset_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
                vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
@@ -406,7 +412,6 @@ static Eina_Bool __vc_mgr_connect_daemon(void *data)
        int service_state = 0;
        int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
 
-       g_m_connect_timer = NULL;
 
        /* check handle */
        if (true == vc_mgr_client_is_valid(g_vc_m)) {
@@ -431,6 +436,7 @@ static Eina_Bool __vc_mgr_connect_daemon(void *data)
                        ecore_main_loop_thread_safe_call_async(__vc_mgr_notify_error, (void*)g_vc_m);
 
                        SLOG(LOG_DEBUG, TAG_VCM, "@@@");
+                       g_m_connect_idler = NULL;
                        return EINA_FALSE;
 
                } else if (0 != ret) {
@@ -489,59 +495,44 @@ static Eina_Bool __vc_mgr_connect_daemon(void *data)
                }
        } else {
                SLOG(LOG_ERROR, TAG_VCM, "[Not ERROR] g_vc_m is not valid. It is destroyed."); //LCOV_EXCL_LINE
+               g_m_connect_idler = NULL;
                return EINA_FALSE;
        }
 
        SLOG(LOG_ERROR, TAG_VCM, "@@@");
 
+       g_m_connect_idler = NULL;
        return EINA_FALSE;
 }
 
 
-static void __start_prepare_thread(void *data, Ecore_Thread *thread)
+static Eina_Bool __vc_mgr_prepare_daemon(void *data)
 {
-       SLOG(LOG_ERROR, TAG_VCM, "@@@ Start prepare thread");
-       int ret = 1, retry_count = 0;
-
        /* Send hello */
-       while (0 != ret) {
-
-               if (retry_count == 10) {
+       if (0 != vc_mgr_dbus_request_hello()) {
+               if (g_retry_connect_count == 20) {
+                       g_retry_connect_count = 0;
                        SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request hello !! send error to manager");
                        __vc_mgr_cb_error(VC_ERROR_TIMED_OUT, -1, "voice_framework.error.vcfw.connect_engine_fail");
-                       return;
-               }
-
-               ret = vc_mgr_dbus_request_hello();
-               if (ret == 0) {
-                       SLOG(LOG_INFO, TAG_VCM, "Success to request hello. retry count(%d)", retry_count);
-                       break;
+                       g_m_connect_timer = NULL;
+                       return EINA_FALSE;
                } else {
-                       retry_count++;
+                       g_retry_connect_count++;
+                       return EINA_TRUE;
                }
        }
 
-       ret = 1;
-       retry_count = 0;
-       while (0 != ret) {
-               if (retry_count == 10) {
-                       SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to connect daemon !!");
-                       return;
-               }
-               ret = __vc_mgr_connect_daemon(NULL);
-               if (ret == 0)
-                       break;
-               else
-                       retry_count++;
-       }
+       SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Connect daemon");
 
-       return;
-}
+       if (NULL == g_m_connect_idler) {
+               SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Create a new idler for preparation");
+               g_m_connect_idler = ecore_idler_add(__vc_mgr_connect_daemon, NULL);
+       } else {
+               SLOG(LOG_DEBUG, TAG_VCM, "[INFO] idler handle is already created");
+       }
 
-static void __end_prepare_thread(void *data, Ecore_Thread *thread)
-{
-       SLOG(LOG_INFO, TAG_VCM, "@@@ End prepare thread");
-       g_mgr_thread = NULL;
+       g_m_connect_timer = NULL;
+       return EINA_FALSE;
 }
 
 int vc_mgr_prepare(void)
@@ -571,12 +562,14 @@ int vc_mgr_prepare(void)
                return VC_ERROR_INVALID_STATE;
        }
 
-       bool is_exist = ecore_thread_check(g_mgr_thread);
-       if (NULL == g_mgr_thread || TRUE == is_exist) {
-               SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Create a new thread for preparation");
+       if (NULL == g_m_connect_timer) {
+               g_retry_connect_count = 0;
+               SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Create a new timer for preparation");
                ecore_thread_main_loop_begin();
-               g_mgr_thread = ecore_thread_run(__start_prepare_thread, __end_prepare_thread, NULL, NULL);
+               g_m_connect_timer = ecore_timer_add(0.02, __vc_mgr_prepare_daemon, NULL);
                ecore_thread_main_loop_end();
+       } else {
+               SLOG(LOG_DEBUG, TAG_VCM, "[INFO] timer handle is already created");
        }
 
        SLOG(LOG_DEBUG, TAG_VCM, "@@@");