Do not call pthread_cancel to terminate an event manager thread 15/201415/2 accepted/tizen/unified/20190315.061251 submit/tizen/20190314.070440
authorSeonah Moon <seonah1.moon@samsung.com>
Tue, 12 Mar 2019 08:54:14 +0000 (17:54 +0900)
committerSeonah Moon <seonah1.moon@samsung.com>
Thu, 14 Mar 2019 01:30:39 +0000 (10:30 +0900)
Change-Id: I05d840b25ccd59f1bcc30408a86504bc28709f86

packaging/download-provider.spec
provider-interface/download-provider-interface.c

index 2721a7d..7b84e56 100755 (executable)
@@ -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
index b3e0d4b..c548bfa 100755 (executable)
@@ -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: