use mutex in pims_ipc_call 87/69887/4 accepted/tizen/3.0/common/20161114.105853 accepted/tizen/3.0/ivi/20161011.062324 accepted/tizen/3.0/mobile/20161015.034222 accepted/tizen/3.0/wearable/20161015.084047 accepted/tizen/common/20160809.183635 accepted/tizen/ivi/20160809.075006 accepted/tizen/mobile/20160809.074902 accepted/tizen/wearable/20160809.074936 submit/tizen/20160809.003913 submit/tizen_3.0_common/20161104.104000 submit/tizen_3.0_ivi/20161010.000006 submit/tizen_3.0_mobile/20161015.000006 submit/tizen_3.0_wearable/20161015.000005
authorJeesun Kim <iamjs.kim@samsung.com>
Tue, 17 May 2016 07:52:08 +0000 (16:52 +0900)
committerJongkyu Koo <jk.koo@samsung.com>
Tue, 9 Aug 2016 05:19:28 +0000 (22:19 -0700)
In multi thread environment, while thread1 is waiting data, thread2
could disconnect socket.

Change-Id: I555eb97fffdb8171158241f368b6e6812cc66936

src/pims-ipc.c

index ebe2faf..2a25ca3 100644 (file)
@@ -87,6 +87,8 @@ typedef struct {
 
        pthread_mutex_t data_queue_mutex;
        GList *data_queue;
+
+       pthread_mutex_t call_mutex; /* not to be interrupted while sending and receiving */
 } pims_ipc_s;
 
 static unsigned int ref_cnt;
@@ -154,6 +156,7 @@ static void __pims_ipc_free_handle(pims_ipc_s *handle)
        if (0 < handle->disconnected_source)
                g_source_remove(handle->disconnected_source);
 
+       pthread_mutex_destroy(&handle->call_mutex);
        pthread_mutex_destroy(&handle->call_status_mutex);
 
        g_free(handle);
@@ -693,6 +696,8 @@ static pims_ipc_h __pims_ipc_create(char *service, pims_ipc_mode_e mode)
                handle->call_status = PIMS_IPC_CALL_STATUS_READY;
                pthread_mutex_unlock(&handle->call_status_mutex);
 
+               pthread_mutex_init(&handle->call_mutex, 0);
+
                bzero(&server_addr, sizeof(server_addr));
                server_addr.sun_family = AF_UNIX;
                snprintf(server_addr.sun_path, sizeof(server_addr.sun_path), "%s", handle->service);
@@ -892,13 +897,20 @@ API int pims_ipc_call(pims_ipc_h ipc, char *module, char *function, pims_ipc_dat
        }
        pthread_mutex_unlock(&handle->call_status_mutex);
 
-       if (__pims_ipc_send(handle, module, function, data_in) != 0)
-               return -1;
+       int ret = 0;
+       pthread_mutex_lock(&handle->call_mutex);
+       do {
+               ret = __pims_ipc_send(handle, module, function, data_in);
+               if (0 != ret)
+                       break;
 
-       if (__pims_ipc_receive(handle, data_out) != 0)
-               return -1;
+               ret = __pims_ipc_receive(handle, data_out);
+               if (0 != ret)
+                       break;
+       } while (0);
+       pthread_mutex_unlock(&handle->call_mutex);
 
-       return 0;
+       return ret;
 }
 
 static gboolean __call_async_idler_cb(gpointer data)