Use new mutex_lock g_dp_event_mutex to access g_dp_event_thread_id 06/198506/2 accepted/tizen/unified/20190128.061818 submit/tizen/20190125.044355
authorCheoleun Moon <chleun.moon@samsung.com>
Fri, 25 Jan 2019 04:39:53 +0000 (13:39 +0900)
committerCheoleun Moon <chleun.moon@samsung.com>
Fri, 25 Jan 2019 04:40:13 +0000 (13:40 +0900)
Change-Id: I5c46017387388a8a734a6a5aafb10b86b9cb967e
Signed-off-by: Cheoleun Moon <chleun.moon@samsung.com>
provider-interface/download-provider-interface.c

index 401e3a8..edf8d15 100755 (executable)
@@ -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);
 
        }