Use critical section when configuration file is reached 65/166265/2
authorSuyeon Hwang <stom.hwang@samsung.com>
Tue, 14 Nov 2017 10:19:44 +0000 (19:19 +0900)
committerSuyeon Hwang <stom.hwang@samsung.com>
Tue, 9 Jan 2018 05:57:58 +0000 (14:57 +0900)
Change-Id: I22965b387df9469f58e3702e80f1f370a407f651
Signed-off-by: Suyeon Hwang <stom.hwang@samsung.com>
(cherry picked from commit 3f78cb87e0175fa040c6e042b1951d6efa171ed5)

common/vc_config_mgr.c

index c8dc9de..77bd3a2 100755 (executable)
@@ -58,6 +58,7 @@ static Ecore_Fd_Handler* g_fd_handler_lang = NULL;
 static int g_fd_lang;
 static int g_wd_lang;
 
+static pthread_mutex_t vc_config_mgr_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 int __vc_config_mgr_print_engine_info();
 
@@ -483,6 +484,13 @@ int vc_config_mgr_initialize(int uid)
        int* get_uid;
        vc_config_client_s* temp_client = NULL;
 
+       if (0 != pthread_mutex_init(&vc_config_mgr_mutex, NULL)) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to initialize vc_config_mgr_mutex.");
+       }
+
+       SLOG(LOG_INFO, vc_config_tag(), "[WARNING] Enter critical section");
+       pthread_mutex_lock(&vc_config_mgr_mutex);
+
        if (0 < g_slist_length(g_config_client_list)) {
                /* Check uid */
                iter = g_slist_nth(g_config_client_list, 0);
@@ -492,6 +500,8 @@ int vc_config_mgr_initialize(int uid)
 
                        if (uid == *get_uid) {
                                SLOG(LOG_WARN, vc_config_tag(), "[CONFIG] uid(%d) has already registered", uid);
+                               pthread_mutex_unlock(&vc_config_mgr_mutex);
+                               SLOG(LOG_DEBUG, vc_config_tag(), "[WARNING] Leave critical section");
                                return 0;
                        }
 
@@ -501,6 +511,7 @@ int vc_config_mgr_initialize(int uid)
                temp_client = (vc_config_client_s*)calloc(1, sizeof(vc_config_client_s));
                if (NULL == temp_client) {
                        SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to allocate memory");
+                       pthread_mutex_unlock(&vc_config_mgr_mutex);
                        return VC_ERROR_OUT_OF_MEMORY;
                }
 
@@ -512,6 +523,8 @@ int vc_config_mgr_initialize(int uid)
                SLOG(LOG_WARN, vc_config_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid);
 
                __vc_config_mgr_print_client_info();
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+               SLOG(LOG_DEBUG, vc_config_tag(), "[WARNING] Leave critical section");
                return 0;
        }
 
@@ -524,6 +537,7 @@ int vc_config_mgr_initialize(int uid)
        if (0 != access(VC_CONFIG_BASE, F_OK)) {
                if (0 != mkdir(VC_CONFIG_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
                        SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to make directory : %s", VC_CONFIG_BASE);
+                       pthread_mutex_unlock(&vc_config_mgr_mutex);
                        return -1;
                } else {
                        SLOG(LOG_DEBUG, vc_config_tag(), "Success to make directory : %s", VC_CONFIG_BASE);
@@ -532,6 +546,7 @@ int vc_config_mgr_initialize(int uid)
        if (0 != access(VC_RUNTIME_INFO_ROOT, F_OK)) {
                if (0 != mkdir(VC_RUNTIME_INFO_ROOT, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
                        SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to make directory : %s", VC_RUNTIME_INFO_ROOT);
+                       pthread_mutex_unlock(&vc_config_mgr_mutex);
                        return -1;
                } else {
                        SLOG(LOG_DEBUG, vc_config_tag(), "Success to make directory : %s", VC_RUNTIME_INFO_ROOT);
@@ -581,11 +596,13 @@ int vc_config_mgr_initialize(int uid)
 
        if (0 != vc_parser_load_config(&g_config_info)) {
                SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to parse configure information");
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
                return -1;
        }
 
        if (0 != __vc_config_mgr_check_engine_is_valid(g_config_info->engine_id)) {
                SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to get default engine");
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
                return VC_CONFIG_ERROR_ENGINE_NOT_FOUND;
        }
 
@@ -598,6 +615,7 @@ int vc_config_mgr_initialize(int uid)
                        char* tmp_language;
                        if (0 != __vc_config_mgr_select_lang(g_config_info->engine_id, &tmp_language)) {
                                SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to select language");
+                               pthread_mutex_unlock(&vc_config_mgr_mutex);
                                return -1;
                        }
 
@@ -610,6 +628,7 @@ int vc_config_mgr_initialize(int uid)
                                if (0 != vc_parser_set_language(tmp_language)) {
                                        free(tmp_language);
                                        SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to save config");
+                                       pthread_mutex_unlock(&vc_config_mgr_mutex);
                                        return -1;
                                }
 
@@ -633,6 +652,7 @@ int vc_config_mgr_initialize(int uid)
        temp_client = (vc_config_client_s*)calloc(1, sizeof(vc_config_client_s));
        if (NULL == temp_client) {
                SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to allocate memory");
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
                return VC_ERROR_OUT_OF_MEMORY;
        }
 
@@ -645,6 +665,8 @@ int vc_config_mgr_initialize(int uid)
 
        __vc_config_mgr_print_client_info();
 
+       pthread_mutex_unlock(&vc_config_mgr_mutex);
+       SLOG(LOG_DEBUG, vc_config_tag(), "[WARNING] Leave critical section");
        return 0;
 }
 
@@ -653,6 +675,9 @@ int vc_config_mgr_finalize(int uid)
        GSList *iter = NULL;
        vc_config_client_s* temp_client = NULL;
 
+       SLOG(LOG_INFO, vc_config_tag(), "[WARNING] Enter critical section");
+       pthread_mutex_lock(&vc_config_mgr_mutex);
+
        if (0 < g_slist_length(g_config_client_list)) {
                /* Check uid */
                iter = g_slist_nth(g_config_client_list, 0);
@@ -674,6 +699,12 @@ int vc_config_mgr_finalize(int uid)
 
        if (0 < g_slist_length(g_config_client_list)) {
                SLOG(LOG_DEBUG, vc_config_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
+               pthread_mutex_unlock(&vc_config_mgr_mutex);
+
+               if (0 != pthread_mutex_destroy(&vc_config_mgr_mutex)) {
+                       SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to destroy vc_config_mgr_mutex.");
+               }
+
                return 0;
        }
 
@@ -701,6 +732,13 @@ int vc_config_mgr_finalize(int uid)
 
        vc_parser_unload_config(g_config_info);
 
+       pthread_mutex_unlock(&vc_config_mgr_mutex);
+       SLOG(LOG_DEBUG, vc_config_tag(), "[WARNING] Leave critical section");
+
+       if (0 != pthread_mutex_destroy(&vc_config_mgr_mutex)) {
+               SLOG(LOG_ERROR, vc_config_tag(), "[ERROR] Fail to destroy vc_config_mgr_mutex.");
+       }
+
        SLOG(LOG_DEBUG, vc_config_tag(), "[Success] Finalize config");
 
        return 0;
@@ -944,7 +982,7 @@ int vc_config_mgr_get_language_list(vc_supported_language_cb callback, void* use
                        /*Get handle data from list*/
                        lang = iter_lang->data;
 
-                       SLOG(LOG_DEBUG, vc_config_tag(), " %s", lang);
+                       SLOG(LOG_INFO, vc_config_tag(), "lang(%s)", lang);
                        if (NULL != lang) {
                                if (false == callback(lang, user_data))
                                        break;