From 24c66e38b4726ab505fd24732c78500f50abe44b Mon Sep 17 00:00:00 2001 From: "sooyeon.kim" Date: Mon, 26 Dec 2016 20:41:45 +0900 Subject: [PATCH] Add pthread_mutex for safety Change-Id: I2a25f3346954190a6784eabe01e082454dc73b43 Signed-off-by: sooyeon.kim (cherry picked from commit dd8b85d1f342ff09bcb011c8b226d28a34e8a07a) --- server/ttsd_data.cpp | 72 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/server/ttsd_data.cpp b/server/ttsd_data.cpp index 932ea35..385b84d 100644 --- a/server/ttsd_data.cpp +++ b/server/ttsd_data.cpp @@ -20,13 +20,13 @@ using namespace std; -typedef struct +typedef struct { char* lang; int vctype; }used_voice_s; -typedef struct +typedef struct { int pid; int uid; @@ -41,6 +41,7 @@ typedef struct static vector g_app_list; +static pthread_mutex_t g_speak_data_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t g_sound_data_mutex = PTHREAD_MUTEX_INITIALIZER; /* @@ -68,7 +69,7 @@ int __data_show_list() int __data_show_sound_list(int index) { SLOG(LOG_DEBUG, tts_tag(), "----- Sound list -----"); - + unsigned int i = 0; std::list::iterator iter; for (iter = g_app_list[index].m_wav_data.begin(); iter != g_app_list[index].m_wav_data.end(); iter++) { @@ -145,7 +146,7 @@ int ttsd_data_new_client(int pid, int uid) #ifdef DATA_DEBUG __data_show_list(); -#endif +#endif return TTSD_ERROR_NONE; } @@ -154,7 +155,7 @@ int ttsd_data_delete_client(int uid) int index = 0; index = ttsd_data_is_client(uid); - + if (index < 0) { SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%d)", uid); return -1; @@ -169,7 +170,7 @@ int ttsd_data_delete_client(int uid) #ifdef DATA_DEBUG __data_show_list(); -#endif +#endif return TTSD_ERROR_NONE; } @@ -179,7 +180,7 @@ int ttsd_data_is_client(int uid) for (int i = 0; i < vsize; i++) { if(g_app_list[i].uid == uid) { - return i; + return i; } } @@ -196,7 +197,7 @@ int ttsd_data_get_pid(int uid) int index; index = ttsd_data_is_client(uid); - + if (index < 0) { SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%d)", uid); return TTSD_ERROR_INVALID_PARAMETER; @@ -209,13 +210,19 @@ int ttsd_data_get_speak_data_size(int uid) { int index = 0; index = ttsd_data_is_client(uid); - + if (index < 0) { SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%d)", uid); return TTSD_ERROR_INVALID_PARAMETER; } + /* mutex is locked */ + pthread_mutex_lock(&g_speak_data_mutex); int size = g_app_list[index].m_speak_data.size(); + + /* mutex is unlocked */ + pthread_mutex_unlock(&g_speak_data_mutex); + return size; } @@ -278,7 +285,7 @@ int ttsd_data_reset_used_voice(int uid, ttsd_used_voice_cb callback) if (NULL != iter->lang) { free(iter->lang); } - } + } g_app_list[index].m_used_voice.clear(); @@ -298,7 +305,10 @@ int ttsd_data_add_speak_data(int uid, speak_data_s* data) SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%d)", uid); return TTSD_ERROR_INVALID_PARAMETER; } - + + /* mutex is locked */ + pthread_mutex_lock(&g_speak_data_mutex); + g_app_list[index].m_speak_data.insert(g_app_list[index].m_speak_data.end(), data); if (1 == data->utt_id) @@ -306,7 +316,9 @@ int ttsd_data_add_speak_data(int uid, speak_data_s* data) #ifdef DATA_DEBUG __data_show_text_list(index); -#endif +#endif + pthread_mutex_unlock(&g_speak_data_mutex); + return TTSD_ERROR_NONE; } @@ -320,10 +332,14 @@ int ttsd_data_get_speak_data(int uid, speak_data_s** data) return TTSD_ERROR_INVALID_PARAMETER; } + /* mutex is locked */ + pthread_mutex_lock(&g_speak_data_mutex); + if (0 == g_app_list[index].m_speak_data.size()) { #ifdef DATA_DEBUG - SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] There is no speak data"); -#endif + SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] There is no speak data"); +#endif + pthread_mutex_unlock(&g_speak_data_mutex); return -1; } @@ -333,7 +349,9 @@ int ttsd_data_get_speak_data(int uid, speak_data_s** data) #ifdef DATA_DEBUG __data_show_text_list(index); -#endif +#endif + pthread_mutex_unlock(&g_speak_data_mutex); + return TTSD_ERROR_NONE; } @@ -358,7 +376,7 @@ int ttsd_data_add_sound_data(int uid, sound_data_s* data) #ifdef DATA_DEBUG __data_show_sound_list(index); -#endif +#endif /* mutex is unlocked */ pthread_mutex_unlock(&g_sound_data_mutex); @@ -394,7 +412,7 @@ int ttsd_data_get_sound_data(int uid, sound_data_s** data) #ifdef DATA_DEBUG __data_show_sound_list(index); -#endif +#endif /* mutex is unlocked */ pthread_mutex_unlock(&g_sound_data_mutex); @@ -433,6 +451,9 @@ int ttsd_data_clear_data(int uid) return TTSD_ERROR_INVALID_PARAMETER; } + /* mutex is locked */ + pthread_mutex_lock(&g_sound_data_mutex); + int removed_last_uttid = -1; speak_data_s* temp_speak = NULL; sound_data_s* temp_sound = NULL; @@ -488,6 +509,9 @@ int ttsd_data_clear_data(int uid) g_app_list[index].m_speak_data.clear(); g_app_list[index].m_wav_data.clear(); + /* mutex is unlocked */ + pthread_mutex_unlock(&g_sound_data_mutex); + return TTSD_ERROR_NONE; } @@ -555,8 +579,8 @@ int ttsd_data_foreach_clients(ttsd_data_get_client_cb callback, void* user_data) #ifdef DATA_DEBUG __data_show_list(); -#endif - +#endif + /* Copy app info */ vector temp_app_list; int vsize = g_app_list.size(); @@ -582,7 +606,7 @@ int ttsd_data_foreach_clients(ttsd_data_get_client_cb callback, void* user_data) for (i = 0;i < vsize;i++) { temp_app_list.erase(temp_app_list.begin()); } - + return 0; } @@ -608,7 +632,7 @@ int ttsd_data_is_current_playing() for (int i = 0; i < vsize; i++) { if(g_app_list[i].state == APP_STATE_PLAYING) { - return g_app_list[i].uid; + return g_app_list[i].uid; } } @@ -622,7 +646,7 @@ int ttsd_data_get_same_pid_client_count(int pid) for (int i = 0;i < vsize;i++) { if(g_app_list[i].pid == pid) { - number++; + number++; } } @@ -670,7 +694,7 @@ int ttsd_data_save_error_log(int uid, FILE* fp) } fprintf(fp, "----------------------"); - + /* get speck data */ fprintf(fp, "----- Text list -----"); @@ -682,6 +706,6 @@ int ttsd_data_save_error_log(int uid, FILE* fp) i++; } fprintf(fp, "---------------------"); - + return 0; } -- 2.7.4