Add a mutex lock for writing hashtable 82/198782/6
authorSangyoon Jang <jeremy.jang@samsung.com>
Tue, 29 Jan 2019 11:14:20 +0000 (20:14 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Wed, 30 Jan 2019 08:58:26 +0000 (08:58 +0000)
Change-Id: I3c461c10c9fee8375e1373e8bf4c29e1e6d8a82d
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/package_manager.c

index bce3f8c..2e818d3 100644 (file)
@@ -18,6 +18,7 @@
 #include <string.h>
 #include <glib.h>
 #include <unistd.h>
+#include <pthread.h>
 
 #include <package-manager.h>
 #include <pkgmgr_installer.h>
@@ -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)