From dbd51eb8d779ec8f168956b7ddcfab641f4307c3 Mon Sep 17 00:00:00 2001 From: Jusung Son Date: Tue, 15 Dec 2020 10:26:52 +0900 Subject: [PATCH] Add mutex lock to support multithread apps Change-Id: Icd937fc01e3dc97f1d8a7ea948b91e6c758a74dc Signed-off-by: Jusung Son --- src/event.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/event.c b/src/event.c index b4a2a08..06b1f47 100644 --- a/src/event.c +++ b/src/event.c @@ -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); -- 2.34.1