Change thread function to ecore timer function 19/249019/2
authorwn.jang <wn.jang@samsung.com>
Fri, 4 Dec 2020 07:51:38 +0000 (16:51 +0900)
committerWonnam Jang <wn.jang@samsung.com>
Fri, 4 Dec 2020 09:05:20 +0000 (09:05 +0000)
dealock log 를 살펴봤는데요, race condition 에 빠진것 같습니다.
subthread (5530) 에서 아래 순서로 main thread 가 멈추길 기다리고 있는데요,
We looked at dealock log, it seems to be in the race condition.
We are waiting for the main thread to stop in the below order in the subthread (5530)

[  433.9562] |    -- #0  0xb4b35758 in __pthread_cond_wait () from /usr/lib/libpthread-2.30.so
[  433.9562] |    -- #1  0xb552949f in ecore_thread_main_loop_begin () from /usr/lib/libecore.so.1.25.1
[  433.9562] |    -- #2  0xb51acca9 in vc_config_mgr_initialize () from /usr/lib/libvc_setting.so
[  433.9563] |    -- #3  0xb4104ce3 in vc_widget_initialize () from /usr/lib/libvc_widget.so

main thread 는 sub thread (5530) 에서 잡고 있는 mutex 가 풀리길 기대하고 있어요.
The main thread expects the mutex held by the sub thread (5530) to be unlocked.

[  433.9549] |    -- #0  0xb4b396c8 in __lll_lock_wait () from /usr/lib/libpthread-2.30.so
[  433.9549] |    -- #1  0xb4b30dd4 in __pthread_mutex_lock () from /usr/lib/libpthread-2.30.so
[  433.9549] |    -- #2  0xb4104ccf in vc_widget_initialize () from /usr/lib/libvc_widget.so
[  433.9549] |    -- #3  0xb5b9214b in _vc_elm_widget_wrapper_initialize () from /usr/lib/libvc-elm.so.0.2.1
[  433.9549] |    -- #4  0xb5ba655d in vc_elm_initialize () from /usr/lib/libvc-elm.so.0.2.1

Change-Id: Icbc6d0551c91d992b7497d3c7a3c902f1bd56d17

src/vc_elm_widget_wrapper.c

index 0348379..cbc307d 100644 (file)
@@ -34,6 +34,8 @@ struct __voice_control_wrapper_s {
 };
 
 static struct __voice_control_wrapper_s vcw = {0, 0, 0, 0, 0, 0, 0, 0};
+static Ecore_Timer *g_initialize_timer = NULL;
+#define INITIALIZE_INTERVAL_TIME 300
 
 static vc_h g_vc_w;
 
@@ -83,23 +85,25 @@ static void __vc_widget_send_current_command_group_cb(vc_cmd_list_h *vc_group, v
        VC_ELM_LOG_DBG("SEND CURRENT COMMAND GROUP cb CALLED");
 }
 
-static void __start_initialize_thread(void *data, Ecore_Thread *thread)
+static Eina_Bool __vc_elm_widget_wrapper_initialize_timer_cb(void *data)
 {
        (void)data;
-       (void)thread;
 
        char *lang = NULL;
        if (vcw.initialized) {
                VC_ELM_LOG_ERR("already initialized");
-               return;
+               g_initialize_timer = NULL;
+               return EINA_FALSE;
        }
 
-       int retry_cnt = 0;
        int ret = -1;
-       while (retry_cnt < MAX_RETRY_CNT && 0 != (ret = vc_widget_initialize(&g_vc_w))) {
+       if (0 != (ret = vc_widget_initialize(&g_vc_w))) {
                VC_ELM_LOG_ERR("Fail to vc_widet_initialize, ret(%d)", ret);
-               usleep(500000);
-               retry_cnt++;
+               if (INITIALIZE_INTERVAL_TIME != (int)ecore_timer_interval_get(g_initialize_timer) * 1000) {
+                       VC_ELM_LOG_INFO("Set initializing timer to %d ms", INITIALIZE_INTERVAL_TIME);
+                       ecore_timer_interval_set(g_initialize_timer, (double)(INITIALIZE_INTERVAL_TIME / 1000));
+               }
+               return EINA_TRUE;
        }
 
        VC_ERROR_CHECK(vc_widget_set_error_cb(g_vc_w, &__vc_error_cb, NULL));
@@ -114,16 +118,8 @@ static void __start_initialize_thread(void *data, Ecore_Thread *thread)
        vcw.lang = lang;
        vcw.initialized = 1;
 
-       VC_ELM_LOG_ERR("[SUCCESS] vc elm initialized");
-       return;
-}
-
-static void __end_initialize_thread(void *data, Ecore_Thread *thread)
-{
-       (void)data;
-       (void)thread;
-
-       VC_ELM_LOG_ERR("[SUCCESS] End initialize thread");
+       g_initialize_timer = NULL;
+       return EINA_FALSE;
 }
 
 int _vc_elm_widget_wrapper_initialize()
@@ -137,7 +133,9 @@ int _vc_elm_widget_wrapper_initialize()
        int ret = -1;
        if (0 != (ret = vc_widget_initialize(&g_vc_w))) {
                VC_ELM_LOG_ERR("Fail to vc_widet_initialize, ret(%d)", ret);
-               ecore_thread_run(__start_initialize_thread, __end_initialize_thread, NULL, NULL);
+               if (g_initialize_timer)
+                       ecore_timer_del(g_initialize_timer);
+               g_initialize_timer = ecore_timer_add(0.0, __vc_elm_widget_wrapper_initialize_timer_cb, NULL);
                return ret;
        }