From 3bec6d3a62bb07ff9fe5a4d1bacea501e819fcde Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Tue, 29 Jan 2019 20:14:20 +0900 Subject: [PATCH] Add a mutex lock for writing hashtable Change-Id: I3c461c10c9fee8375e1373e8bf4c29e1e6d8a82d Signed-off-by: Sangyoon Jang --- src/package_manager.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/package_manager.c b/src/package_manager.c index bce3f8c..2e818d3 100644 --- a/src/package_manager.c +++ b/src/package_manager.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -50,6 +51,7 @@ struct package_manager_s { GHashTable *event_info_table; package_manager_event_cb event_cb; void *user_data; + pthread_mutex_t mutex; }; struct package_manager_request_s { @@ -1001,6 +1003,8 @@ API int package_manager_create(package_manager_h *manager) } package_manager->handle_id = package_manager_new_id(); + if (pthread_mutex_init(&package_manager->mutex, NULL)) + _LOGE("pthread_mutex_init failed"); *manager = package_manager; @@ -1024,6 +1028,7 @@ API int package_manager_destroy(package_manager_h manager) NULL); } + pthread_mutex_destroy(&manager->mutex); pkgmgr_client_free(manager->pc); g_hash_table_destroy(manager->event_info_table); free(manager); @@ -1076,6 +1081,7 @@ static int internal_callback(uid_t target_uid, int req_id, const char *pkg_type, return PACKAGE_MANAGER_ERROR_NONE; if (manager && manager->event_info_table) { + pthread_mutex_lock(&manager->mutex); info = g_hash_table_lookup(manager->event_info_table, pkg_name); } else { _LOGE("invalid handle"); @@ -1085,14 +1091,17 @@ static int internal_callback(uid_t target_uid, int req_id, const char *pkg_type, if (!info) { if (strcasecmp(key, "start") != 0) { _LOGD("unexpected signal or no info(removed)"); + pthread_mutex_unlock(&manager->mutex); return PACKAGE_MANAGER_ERROR_NONE; } } if (strcasecmp(key, "start") == 0) { ret = package_manager_get_event_type(val, &event_type); - if (ret != PACKAGE_MANAGER_ERROR_NONE) + if (ret != PACKAGE_MANAGER_ERROR_NONE) { + pthread_mutex_unlock(&manager->mutex); return PACKAGE_MANAGER_ERROR_INVALID_PARAMETER; + } if (!info) { __insert_event_info(manager, pkg_name, event_type, @@ -1150,6 +1159,8 @@ static int internal_callback(uid_t target_uid, int req_id, const char *pkg_type, g_hash_table_remove(manager->event_info_table, info->pkg_name); } + pthread_mutex_unlock(&manager->mutex); + return PACKAGE_MANAGER_ERROR_NONE; } @@ -1253,7 +1264,9 @@ API int package_manager_unset_event_cb(package_manager_h manager) manager->event_cb = NULL; manager->user_data = NULL; + pthread_mutex_lock(&manager->mutex); g_hash_table_remove_all(manager->event_info_table); + pthread_mutex_unlock(&manager->mutex); retval = pkgmgr_client_remove_listen_status(manager->pc); if (retval == PKGMGR_R_EINVAL) -- 2.7.4