From f737a3e6902004f9c4933fb1633cfe2212052bb2 Mon Sep 17 00:00:00 2001 From: Seonah Moon Date: Tue, 12 Mar 2019 17:54:14 +0900 Subject: [PATCH] Do not call pthread_cancel to terminate an event manager thread Change-Id: I05d840b25ccd59f1bcc30408a86504bc28709f86 --- packaging/download-provider.spec | 2 +- provider-interface/download-provider-interface.c | 41 ++++++------------------ 2 files changed, 11 insertions(+), 32 deletions(-) diff --git a/packaging/download-provider.spec b/packaging/download-provider.spec index 2721a7d..7b84e56 100755 --- a/packaging/download-provider.spec +++ b/packaging/download-provider.spec @@ -1,6 +1,6 @@ Name: download-provider Summary: Download the contents in background -Version: 2.1.108 +Version: 2.1.109 Release: 0 Group: Development/Libraries License: Apache-2.0 diff --git a/provider-interface/download-provider-interface.c b/provider-interface/download-provider-interface.c index b3e0d4b..c548bfa 100755 --- a/provider-interface/download-provider-interface.c +++ b/provider-interface/download-provider-interface.c @@ -90,7 +90,6 @@ 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 ///////////////// @@ -277,14 +276,9 @@ 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); + CLIENT_MUTEX_LOCK(&g_clear_mutex); + g_dp_event_thread_id = 0; + CLIENT_MUTEX_UNLOCK(&g_clear_mutex); __clear_interface(); return DP_ERROR_NONE; } @@ -304,30 +298,26 @@ 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); + CLIENT_MUTEX_LOCK(&g_clear_mutex); g_dp_event_thread_id = 0; - CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex); + CLIENT_MUTEX_UNLOCK(&g_clear_mutex); CLIENT_MUTEX_LOCK(&g_function_mutex); __clear_interface(); CLIENT_MUTEX_UNLOCK(&g_function_mutex); return 0; } - // deferred wait to cancal until next function called. - // ex) function : select, read in this thread - pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); - while (g_dp_client != NULL && g_dp_client->notify >= 0) { - CLIENT_MUTEX_LOCK(&g_dp_event_mutex); + CLIENT_MUTEX_LOCK(&g_clear_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); + CLIENT_MUTEX_UNLOCK(&g_clear_mutex); // another thread may work. just terminate - CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex); break; } - CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex); + CLIENT_MUTEX_UNLOCK(&g_clear_mutex); // blocking fifo. dp_ipc_event_fmt eventinfo; @@ -337,9 +327,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); + CLIENT_MUTEX_LOCK(&g_clear_mutex); g_dp_event_thread_id = 0; - CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex); + CLIENT_MUTEX_UNLOCK(&g_clear_mutex); CLIENT_MUTEX_LOCK(&g_function_mutex); __clear_interface(); CLIENT_MUTEX_UNLOCK(&g_function_mutex); @@ -352,9 +342,6 @@ static void *__dp_event_manager(void *arg) continue; } - // begin protect callback sections & thread safe - pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); - if (eventinfo.state == DP_STATE_DOWNLOADING && eventinfo.received_size > 0) { if (eventinfo.id == g_interface_slots[index].id && @@ -373,12 +360,7 @@ static void *__dp_event_manager(void *arg) g_interface_slots[index].state_data); } } - 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; } @@ -495,7 +477,6 @@ 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) { @@ -505,8 +486,6 @@ static int __connect_to_provider() pthread_detach(g_dp_event_thread_id); } } - CLIENT_MUTEX_UNLOCK(&g_dp_event_mutex); - } EXIT_CONNECT: -- 2.7.4