Add mutex lock to support multithread apps 51/249551/1
authorJusung Son <jusung07.son@samsung.com>
Tue, 15 Dec 2020 01:26:52 +0000 (10:26 +0900)
committerJusung Son <jusung07.son@samsung.com>
Tue, 15 Dec 2020 01:26:52 +0000 (10:26 +0900)
Change-Id: Icd937fc01e3dc97f1d8a7ea948b91e6c758a74dc
Signed-off-by: Jusung Son <jusung07.son@samsung.com>
src/event.c

index b4a2a08e430182c7c428599b0235c9ec0111ed18..06b1f479d3c1e3d021229b7335fb64cee36548ca 100644 (file)
@@ -52,6 +52,8 @@ static event_cb __earlier_callback;
 static void *__earlier_user_data;
 static pthread_mutex_t __register_sync_lock = PTHREAD_MUTEX_INITIALIZER;
 static GHashTable *__event_table;
+static pthread_mutex_t __event_handle_lock = PTHREAD_MUTEX_INITIALIZER;
+static GList *__event_handle_list;
 
 #define KEY_ALIAS_APP_ID "http://tizen.org/metadata/app-event/alias-appid-mode"
 
@@ -231,6 +233,9 @@ static void __event_eventsystem_callback(const char *real_event_name,
        event_handler_h handler = (event_handler_h)user_data;
        bundle *b;
        const char *registered_event_name;
+       GList *found;
+       event_cb handler_cb;
+       void *handler_user_data;
 
        registered_event_name = g_hash_table_lookup(__event_table, real_event_name);
        LOGD("real_event_name(%s , %s)", real_event_name, registered_event_name);
@@ -248,14 +253,26 @@ static void __event_eventsystem_callback(const char *real_event_name,
                return;
        }
 
-       if (handler && handler->cb) {
+       pthread_mutex_lock(&__event_handle_lock);
+       found = g_list_find(__event_handle_list, handler);
+       if (found == NULL) {
+               LOGW("%p doesn't exist", handler);
+               pthread_mutex_unlock(&__event_handle_lock);
+               return;
+       }
+
+       handler_cb = handler->cb;
+       handler_user_data = handler->user_data;
+       pthread_mutex_unlock(&__event_handle_lock);
+
+       if (handler_cb) {
                b = bundle_decode(event_data, len);
                if (b == NULL) {
                        LOGE("bundle_decode failed");
                        return;
                }
 
-               handler->cb(registered_event_name, b, handler->user_data);
+               handler_cb(registered_event_name, b, handler_user_data);
                bundle_free(b);
        }
 }
@@ -315,6 +332,12 @@ int event_add_event_handler(const char *event_name, event_cb callback,
        handler->cb = callback;
        handler->user_data = user_data;
 
+       pthread_mutex_lock(&__event_handle_lock);
+       __event_handle_list = g_list_prepend(__event_handle_list, handler);
+       pthread_mutex_unlock(&__event_handle_lock);
+
+       LOGW("event_add_event_handler(%p, %s)", handler, event_name);
+
        *event_handler = handler;
 
        return EVENT_ERROR_NONE;
@@ -353,6 +376,12 @@ int event_remove_event_handler(event_handler_h event_handler)
        if (ret < 0)
                return __event_error(EVENT_ERROR_IO_ERROR, __FUNCTION__, NULL);
 
+       pthread_mutex_lock(&__event_handle_lock);
+       __event_handle_list = g_list_remove(__event_handle_list, event_handler);
+       pthread_mutex_unlock(&__event_handle_lock);
+
+       LOGW("event_remove_event_handler(%p, %s)", event_handler, event_handler->event_name);
+
        free(event_handler->event_name);
        free(event_handler);