Add to mutex when calling the g_queue_push_tail 49/107749/4
authorYoungHun Kim <yh8004.kim@samsung.com>
Thu, 29 Dec 2016 12:53:05 +0000 (21:53 +0900)
committerYoungHun Kim <yh8004.kim@samsung.com>
Fri, 30 Dec 2016 05:02:30 +0000 (21:02 -0800)
Change-Id: Ib77fd799dba78d1b5a52311b50fc740596195263

include/muse_core_ipc.h
src/muse_core.c
src/muse_core_ipc.c

index 481aa73..d5b06e7 100644 (file)
@@ -39,10 +39,12 @@ typedef struct muse_msg *muse_msg_h;
 
 typedef struct muse_core_ipc {
        tbm_bufmgr bufmgr;
+       void (*push_data)(gpointer);
        void (*free)(void);
        GHashTable *table;
        pid_t pid;
        GQueue *module_queue;
+       GMutex g_muse_ipc_queue_lock;
 } muse_core_ipc_t;
 
 typedef enum {
index 61f5699..268ae1c 100644 (file)
@@ -296,8 +296,7 @@ static gboolean _muse_core_connection_handler(GIOChannel *source, GIOCondition c
 
                memset(module, 0, sizeof(muse_module_t));
                module->ch[channel].fd = client_sockfd;
-               g_queue_push_tail(muse_core_ipc_get_instance()->module_queue, (gpointer) module);
-               LOGD("g_queue_get_length : %d [%p]", g_queue_get_length(muse_core_ipc_get_instance()->module_queue), module);
+               muse_core_ipc_get_instance()->push_data((gpointer) module);
        }
 
        if ((job = malloc(sizeof(muse_core_workqueue_job_t))) == NULL) {
index 0b24062..78c3a24 100644 (file)
@@ -55,8 +55,9 @@ static size_t _muse_core_ipc_get_complete_msg_len(int sock_fd, char *msg);
 static int _muse_core_ipc_verify_msg_complete(int sock_fd, char *msg, int msg_len);
 static gboolean _muse_core_ipc_init_bufmgr(void);
 static void _muse_core_ipc_deinit_bufmgr(void);
+static void _muse_core_ipc_push_data(gpointer data);
 static void _muse_core_ipc_free(void);
-static void _muse_core_ipc_init_instance(void (*free)(void));
+static void _muse_core_ipc_init_instance(void (*push_data) (gpointer), void (*free)(void));
 static int _muse_core_ipc_get_valid_fd_count(int *fds);
 
 static void _muse_core_ipc_client_cleanup(muse_module_h module)
@@ -79,7 +80,12 @@ static void _muse_core_ipc_client_cleanup(muse_module_h module)
        g_cond_clear(&module->ch[MUSE_CHANNEL_DATA].cond);
        LOGD("worker exit");
 
+       g_mutex_lock(&g_muse_core_ipc->g_muse_ipc_queue_lock);
+
        g_queue_remove(g_muse_core_ipc->module_queue, (gpointer)module);
+       LOGD("g_queue_remove %p", module);
+
+       g_mutex_unlock(&g_muse_core_ipc->g_muse_ipc_queue_lock);
 
        muse_core_worker_exit(module);
 }
@@ -429,6 +435,24 @@ static void _muse_core_ipc_deinit_bufmgr(void)
        LOGD("Leave");
 }
 
+static void _muse_core_ipc_push_data(gpointer data)
+{
+       LOGD("Enter");
+
+       g_return_if_fail(g_muse_core_ipc->module_queue);
+       g_return_if_fail(data);
+
+       g_mutex_lock(&g_muse_core_ipc->g_muse_ipc_queue_lock);
+
+       g_queue_push_tail(g_muse_core_ipc->module_queue, data);
+
+       LOGD("g_queue_get_length : %d [%p]", g_queue_get_length(g_muse_core_ipc->module_queue), data);
+
+       g_mutex_unlock(&g_muse_core_ipc->g_muse_ipc_queue_lock);
+
+       LOGD("Leave");
+}
+
 static void _muse_core_ipc_free(void)
 {
        LOGD("Enter");
@@ -448,7 +472,7 @@ static void _muse_core_ipc_free(void)
        LOGD("Leave");
 }
 
-static void _muse_core_ipc_init_instance(void (*free)(void))
+static void _muse_core_ipc_init_instance(void (*push_data) (gpointer), void (*free)(void))
 {
        g_return_if_fail(free);
        g_return_if_fail(g_muse_core_ipc == NULL);
@@ -459,6 +483,7 @@ static void _muse_core_ipc_init_instance(void (*free)(void))
        g_muse_core_ipc->table = g_hash_table_new(g_direct_hash, g_direct_equal);
        g_return_if_fail(g_muse_core_ipc->table);
 
+       g_muse_core_ipc->push_data = push_data;
        g_muse_core_ipc->free = free;
        g_muse_core_ipc->module_queue = g_queue_new();
        g_return_if_fail(g_muse_core_ipc->module_queue);
@@ -839,7 +864,7 @@ void muse_core_ipc_init(void)
        LOGD("Enter");
 
        if (g_muse_core_ipc == NULL)
-               _muse_core_ipc_init_instance(_muse_core_ipc_free);
+               _muse_core_ipc_init_instance(_muse_core_ipc_push_data, _muse_core_ipc_free);
 
        LOGD("Leave");
 }