From a0e5f50a42200be2201632df158e52d6ba35fdc6 Mon Sep 17 00:00:00 2001 From: Cheoleun Moon Date: Fri, 25 Jan 2019 13:39:53 +0900 Subject: [PATCH] Use new mutex_lock g_dp_event_mutex to access g_dp_event_thread_id Change-Id: I5c46017387388a8a734a6a5aafb10b86b9cb967e Signed-off-by: Cheoleun Moon --- provider-interface/download-provider-interface.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/provider-interface/download-provider-interface.c b/provider-interface/download-provider-interface.c index 401e3a8..edf8d15 100755 --- a/provider-interface/download-provider-interface.c +++ b/provider-interface/download-provider-interface.c @@ -88,6 +88,7 @@ dp_interface_ipc *g_dp_client = NULL; dp_interface_slot g_interface_slots[MAX_DOWNLOAD_HANDLE]; static pthread_mutex_t g_function_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t g_clear_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t g_dp_event_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_t g_dp_event_thread_id = 0; //////////// defines functions ///////////////// @@ -274,12 +275,14 @@ static void __clear_interface() static int __bp_disconnect(const char *funcname) { TRACE_DEBUG("%s", funcname); + CLIENT_MUTEX_LOCK(&g_dp_event_mutex); if (g_dp_event_thread_id > 0 && pthread_kill(g_dp_event_thread_id, 0) != ESRCH) { if (pthread_cancel(g_dp_event_thread_id) != 0) TRACE_ERROR("pthread:%d", (int)g_dp_event_thread_id); g_dp_event_thread_id = 0; } + CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex); __clear_interface(); return DP_ERROR_NONE; } @@ -299,7 +302,9 @@ static void *__dp_event_manager(void *arg) g_dp_client->notify = open(notify_fifo, O_RDONLY, 0600); if (g_dp_client->notify < 0) { TRACE_ERROR("[CRITICAL] failed to ESTABILISH IPC %s", notify_fifo); + CLIENT_MUTEX_LOCK(&g_dp_event_mutex); g_dp_event_thread_id = 0; + CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex); CLIENT_MUTEX_LOCK(&g_function_mutex); __clear_interface(); CLIENT_MUTEX_UNLOCK(&g_function_mutex); @@ -311,13 +316,16 @@ static void *__dp_event_manager(void *arg) pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); while (g_dp_client != NULL && g_dp_client->notify >= 0) { + CLIENT_MUTEX_LOCK(&g_dp_event_mutex); if (g_dp_event_thread_id <= 0 || pthread_self() != g_dp_event_thread_id) { TRACE_ERROR("competitive threads self:%lu global:%lu", pthread_self(), g_dp_event_thread_id); // another thread may work. just terminate + CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex); break; } + CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex); // blocking fifo. dp_ipc_event_fmt eventinfo; @@ -327,7 +335,9 @@ static void *__dp_event_manager(void *arg) (eventinfo.id <= 0 && eventinfo.errorcode == DP_ERROR_CLIENT_DOWN)) { TRACE_INFO("expelled by provider"); + CLIENT_MUTEX_LOCK(&g_dp_event_mutex); g_dp_event_thread_id = 0; + CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex); CLIENT_MUTEX_LOCK(&g_function_mutex); __clear_interface(); CLIENT_MUTEX_UNLOCK(&g_function_mutex); @@ -364,7 +374,9 @@ static void *__dp_event_manager(void *arg) pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); } // while + CLIENT_MUTEX_LOCK(&g_dp_event_mutex); g_dp_event_thread_id = 0; // set 0 to not call pthread_cancel + CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex); TRACE_DEBUG("thread end by itself"); return 0; } @@ -481,6 +493,7 @@ static int __connect_to_provider() -1, DP_SEC_INIT, DP_PROP_NONE, NULL); } + CLIENT_MUTEX_LOCK(&g_dp_event_mutex); if (errorcode == DP_ERROR_NONE && g_dp_event_thread_id <= 0) { if (pthread_create(&g_dp_event_thread_id, NULL, __dp_event_manager, g_dp_client) != 0) { @@ -490,6 +503,7 @@ static int __connect_to_provider() pthread_detach(g_dp_event_thread_id); } } + CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex); } -- 2.7.4