Add and delete timer on main thread for safe handling 36/264536/2
authorSuyeon Hwang <stom.hwang@samsung.com>
Fri, 24 Sep 2021 06:26:26 +0000 (15:26 +0900)
committerSuyeon Hwang <stom.hwang@samsung.com>
Mon, 27 Sep 2021 10:35:47 +0000 (19:35 +0900)
Change-Id: I8eb75373d4c23d846fe8035bd6b9bc84f79c162c
Signed-off-by: Suyeon Hwang <stom.hwang@samsung.com>
server/ttsd_player.c

index 2b60c95653fb1777bd7e04c06f587662e50d7f47..25650e6dd40ae3ef778e95a71e0e40c84f6a17ec 100644 (file)
@@ -53,6 +53,8 @@ typedef struct {
 #define SOUND_BUFFER_LENGTH    2048
 #define FOCUS_SERVER_READY "/tmp/.sound_server_ready"
 
+static const intptr_t CHECK_TIMER_DELETE = 1;
+
 /* Sound buf save for test */
 /*
 #define BUF_SAVE_MODE
@@ -102,7 +104,6 @@ If you choose too big value, it may cause integer overflow issue.
 
 static struct timespec g_policy_set_time;
 static Ecore_Timer* g_delayed_unset_policy_timer = NULL;
-static pthread_mutex_t g_delayed_unset_policy_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static int g_focus_watch_id = -1;
 
@@ -422,14 +423,18 @@ static void __end_play_thread(void *data, Ecore_Thread *thread)
 #endif
 }
 
-static void __set_policy_for_playing(int volume)
+static void __del_timer_for_delayed_recover(void* data)
 {
-       pthread_mutex_lock(&g_delayed_unset_policy_mutex);
        if (NULL != g_delayed_unset_policy_timer) {
-               ecore_timer_del(g_delayed_unset_policy_timer);
+               int result = (intptr_t)ecore_timer_del(g_delayed_unset_policy_timer);
                g_delayed_unset_policy_timer = NULL;
+               SLOG(LOG_ERROR, tts_tag(), "[BG] Remove timer (%d)", result);
        }
-       pthread_mutex_unlock(&g_delayed_unset_policy_mutex);
+}
+
+static void __set_policy_for_playing(int volume)
+{
+       ecore_main_loop_thread_safe_call_async(__del_timer_for_delayed_recover, NULL);
 
        /* Set stream info */
        int ret;
@@ -468,21 +473,11 @@ static void __set_policy_for_playing(int volume)
 
 static Eina_Bool __delay_recover_background_volume(void* data)
 {
-       pthread_mutex_lock(&g_delayed_unset_policy_mutex);
        __recover_background_volume();
-       g_delayed_unset_policy_timer = NULL;
-
        SLOG(LOG_INFO, tts_tag(), "[BG] Delayed unset policy success");
-       pthread_mutex_unlock(&g_delayed_unset_policy_mutex);
-       return EINA_FALSE;
-}
 
-static void __set_timer_for_delay_recover(void* data)
-{
-       long long int diff = (intptr_t)data;
-       double delay = (double)(SND_MGR_DUCKING_DURATION - diff) / 1000.0;
-       g_delayed_unset_policy_timer = ecore_timer_add(delay, __delay_recover_background_volume, NULL);
-       SLOG(LOG_INFO, tts_tag(), "[BG] Delayed unset policy (%p), delay(%f)", g_delayed_unset_policy_timer, delay);
+       g_delayed_unset_policy_timer = NULL;
+       return EINA_FALSE;
 }
 
 static long long int __get_duration_from_last_volume_change()
@@ -497,6 +492,23 @@ static long long int __get_duration_from_last_volume_change()
        return diff;
 }
 
+static void __set_timer_for_delay_recover(void* data)
+{
+       if (NULL != g_delayed_unset_policy_timer) {
+               return;
+       }
+
+       long long int diff = __get_duration_from_last_volume_change();
+       if (diff > SND_MGR_DUCKING_DURATION) {
+               SLOG(LOG_INFO, tts_tag(), "[BG] Direct unset policy");
+               __recover_background_volume();
+       } else {
+               double delay = (double)(SND_MGR_DUCKING_DURATION - diff) / 1000.0;
+               g_delayed_unset_policy_timer = ecore_timer_add(delay, __delay_recover_background_volume, (void*)CHECK_TIMER_DELETE);
+               SLOG(LOG_INFO, tts_tag(), "[BG] Delayed unset policy (%p), delay(%f)", g_delayed_unset_policy_timer, delay);
+       }
+}
+
 static void __unset_policy_for_playing()
 {
        int ret;
@@ -521,23 +533,10 @@ static void __unset_policy_for_playing()
                }
        }
 
-       pthread_mutex_lock(&g_delayed_unset_policy_mutex);
-       if (NULL == g_delayed_unset_policy_timer) {
-               long long int diff = __get_duration_from_last_volume_change();
-               if (diff > SND_MGR_DUCKING_DURATION) {
-                       SLOG(LOG_INFO, tts_tag(), "[BG] Direct unset policy");
-                       __recover_background_volume();
-               } else {
-                       intptr_t ptr_diff = diff;
-                       ecore_main_loop_thread_safe_call_async(__set_timer_for_delay_recover, (void*)ptr_diff);
-               }
-       }
-       pthread_mutex_unlock(&g_delayed_unset_policy_mutex);
+       ecore_main_loop_thread_safe_call_async(__set_timer_for_delay_recover, NULL);
 
        g_is_set_policy = false;
        SLOG(LOG_ERROR, tts_tag(), "[BG] g_is_set_policy(%d)", g_is_set_policy);
-
-
        SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] unset policy for playing");
 
        return;