Add mutex lock to support mutithreads apps 50/236050/3
authorhyunho <hhstark.kang@samsung.com>
Fri, 12 Jun 2020 08:07:43 +0000 (17:07 +0900)
committerhyunho <hhstark.kang@samsung.com>
Mon, 15 Jun 2020 07:00:09 +0000 (16:00 +0900)
Change-Id: I6004a4992c3057a7014f3ba63947a7e3b4f5099d
Signed-off-by: hyunho <hhstark.kang@samsung.com>
widget_viewer_evas/src/widget_viewer_evas.c

index 870892f..b0e4c6f 100644 (file)
@@ -191,6 +191,7 @@ static int __find_launch_info(gconstpointer a, gconstpointer b);
 static void __remove_launch_info(const char *instance_id);
 static void __launch_instance(void);
 static void __remove_launch_timer(void);
+static pthread_mutex_t __mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static void __destroy_pending_item(gpointer data)
 {
@@ -693,9 +694,11 @@ static void __launch_instance()
        }
 
        instance_id = s_info.launch_list->data;
+       pthread_mutex_lock(&__mutex);
        info = g_hash_table_lookup(s_info.widget_table, instance_id);
        if (info == NULL) {
                LOGW("can not find instance (%s)", instance_id);
+               pthread_mutex_unlock(&__mutex);
                return;
        }
        evas_object_geometry_get(info->layout, NULL, NULL, &w, &h);
@@ -736,16 +739,19 @@ static void __launch_instance()
                s_info.launch_timer = g_timeout_add(WIDGET_LAUNCH_TIMEOUT,
                                __launch_timeout_cb, info->instance_id);
        }
+       pthread_mutex_unlock(&__mutex);
 }
 
 static void __set_faulted(const char *instance_id)
 {
        struct widget_info *info;
 
+       pthread_mutex_lock(&__mutex);
        info = g_hash_table_lookup(s_info.widget_table, instance_id);
        if (!info) {
                aul_widget_write_log(LOG_TAG, "[%s:%d] fail to find info (%s)",
                        __FUNCTION__, __LINE__, instance_id);
+               pthread_mutex_unlock(&__mutex);
                return;
        }
        aul_widget_write_log(LOG_TAG, "[%s:%d]  set faulted for (%s)",
@@ -753,6 +759,7 @@ static void __set_faulted(const char *instance_id)
        info->pid = -1;
        info->is_faulted = true;
        __display_overlay_text(info);
+       pthread_mutex_unlock(&__mutex);
 }
 
 static int __clear_launch_waiting(char *instance_id)
@@ -761,6 +768,7 @@ static int __clear_launch_waiting(char *instance_id)
        int ret;
 
        LOGW("Clear launch waiting !! %s", instance_id);
+       pthread_mutex_lock(&__mutex);
        info = g_hash_table_lookup(s_info.widget_table, instance_id);
        if (!info)
                LOGE("Unable to find a proper instance");/* LCOV_EXCL_LINE */
@@ -771,12 +779,14 @@ static int __clear_launch_waiting(char *instance_id)
                if (ret != AUL_R_OK) {
                        LOGW("Fail to term widget(%d) pid(%d) !!",
                                ret, info->pid);
+                       pthread_mutex_unlock(&__mutex);
                        return 0;
                }
                info->no_response_count++;
                LOGW("Widget is not responding(%d) !! %s(%d)",
                                info->no_response_count, instance_id, info->pid);
        }
+       pthread_mutex_unlock(&__mutex);
        return 0;
 }
 
@@ -791,6 +801,7 @@ static int __restart_terminated_widget(const char *widget_id)
        int pid;
        char *id;
 
+       pthread_mutex_lock(&__mutex);
        g_hash_table_iter_init(&iter, s_info.widget_table);
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                widget_instance_info = (struct widget_info *)value;
@@ -808,6 +819,7 @@ static int __restart_terminated_widget(const char *widget_id)
 
        if (target_pid == 0) {
                LOGW("can not find widget(%s)", widget_id);
+               pthread_mutex_unlock(&__mutex);
                return 0;
        }
 
@@ -816,6 +828,7 @@ static int __restart_terminated_widget(const char *widget_id)
                widget_instance_info->no_response_count = 0;
                aul_widget_write_log(LOG_TAG, "[%s:%d]  not responding (%s)",
                        __FUNCTION__, __LINE__, widget_id);
+               pthread_mutex_unlock(&__mutex);
                return 0;
        }
 
@@ -836,7 +849,7 @@ static int __restart_terminated_widget(const char *widget_id)
                __add_launch_list(instance_id);
        }
        __launch_instance();
-
+       pthread_mutex_unlock(&__mutex);
        return 0;
 }
 /* LCOV_EXCL_STOP */
@@ -861,6 +874,7 @@ static int __handle_restart_widget_request(const char *widget_id)
        struct widget_info *widget_instance_info;
        int target_pid = 0;
 
+       pthread_mutex_lock(&__mutex);
        g_hash_table_iter_init(&iter, s_info.widget_table);
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                widget_instance_info = (struct widget_info *)value;
@@ -872,6 +886,7 @@ static int __handle_restart_widget_request(const char *widget_id)
 
        if (target_pid == 0) {
                LOGW("can not find widget (%s)", widget_id);
+               pthread_mutex_unlock(&__mutex);
                return 0;
        }
 
@@ -886,7 +901,7 @@ static int __handle_restart_widget_request(const char *widget_id)
                        widget_id, target_pid);
        aul_widget_write_log(LOG_TAG, "[%s:%d]  %s, targetpid : %d",
                        __FUNCTION__, __LINE__, widget_id, target_pid);
-
+       pthread_mutex_unlock(&__mutex);
        return 0;
 }
 /* LCOV_EXCL_STOP */
@@ -906,9 +921,11 @@ static int __instance_event_cb(const char *widget_id, const char *instance_id, i
                return 0;
        }
 
+       pthread_mutex_lock(&__mutex);
        info = g_hash_table_lookup(s_info.widget_table, instance_id);
        if (!info) {
                LOGE("Unable to find a proper object");/* LCOV_EXCL_LINE */
+               pthread_mutex_unlock(&__mutex);
                return -1;/* LCOV_EXCL_LINE */
        }
 
@@ -916,6 +933,7 @@ static int __instance_event_cb(const char *widget_id, const char *instance_id, i
                        event != WIDGET_INSTANCE_EVENT_CREATE_ABORTED) {
                if (info->state == WIDGET_STATE_DETACHED) {
                        __push_event_queue(info, event);
+                       pthread_mutex_unlock(&__mutex);
                        return 0;
                }
        }
@@ -996,16 +1014,18 @@ static int __instance_event_cb(const char *widget_id, const char *instance_id, i
                __set_faulted(info->instance_id);
                break;
        default:
-               /* unhandled event */
+               pthread_mutex_unlock(&__mutex);
                return 0;
        }
 
        if (!info->layout) {
                LOGE("object is not ready");
+               pthread_mutex_unlock(&__mutex);
                return 0;
        }
 
        __smart_callback_call(info->layout, smart_signal, &event_info);
+       pthread_mutex_unlock(&__mutex);
 
        return 0;
 }
@@ -1056,6 +1076,7 @@ static void __aul_widget_event_cb(const char *event_name,
        path = bundle_get_val(event_data, "path");
        app_get_id(&id);
 
+       pthread_mutex_lock(&__mutex);
        g_hash_table_iter_init(&iter, s_info.widget_table);
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                info = (struct widget_info *)value;
@@ -1081,11 +1102,13 @@ static void __aul_widget_event_cb(const char *event_name,
                _widget_viewer_image_save(tbm_obj, path, buf, 100, 100);
        }
        free(id);
+       pthread_mutex_unlock(&__mutex);
 }
 
 API int widget_viewer_evas_init(Evas_Object *win)
 {
        char app_id[255];
+       pthread_mutexattr_t mutex_attr;
 
        if (!__is_widget_feature_enabled())
                return WIDGET_ERROR_NOT_SUPPORTED;
@@ -1118,6 +1141,10 @@ API int widget_viewer_evas_init(Evas_Object *win)
                return WIDGET_ERROR_INVALID_PARAMETER;
        }
 
+       pthread_mutexattr_init(&mutex_attr);
+       pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
+       pthread_mutex_init(&__mutex, &mutex_attr);
+
        widget_instance_init(app_id);
        widget_instance_listen_event(__instance_event_cb, NULL);
 
@@ -1146,11 +1173,13 @@ API int widget_viewer_evas_fini(void)
 
        aul_widget_unset_event_cb();
 
+       pthread_mutex_lock(&__mutex);
        if (s_info.widget_table)
                g_hash_table_destroy(s_info.widget_table);
 
        if (s_info.instance_cnt_table)
                g_hash_table_destroy(s_info.instance_cnt_table);
+       pthread_mutex_unlock(&__mutex);
 
        screen_connector_toolkit_evas_fini(SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET);
        widget_instance_unlisten_event(__instance_event_cb);
@@ -1182,6 +1211,7 @@ API int widget_viewer_evas_notify_resumed_status_of_viewer(void)
        if (__check_privilege(WIDGET_PRIVILEGE) < 0)
                return WIDGET_ERROR_PERMISSION_DENIED;
 
+       pthread_mutex_lock(&__mutex);
        g_hash_table_iter_init(&iter, s_info.widget_table);
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                info = (struct widget_info *)value;
@@ -1217,6 +1247,7 @@ API int widget_viewer_evas_notify_resumed_status_of_viewer(void)
                        }
                }
        }
+       pthread_mutex_unlock(&__mutex);
 
        return WIDGET_ERROR_NONE;
 }
@@ -1240,6 +1271,7 @@ API int widget_viewer_evas_notify_paused_status_of_viewer(void)
        if (__check_privilege(WIDGET_PRIVILEGE) < 0)
                return WIDGET_ERROR_PERMISSION_DENIED;
 
+       pthread_mutex_lock(&__mutex);
        g_hash_table_iter_init(&iter, s_info.widget_table);
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                info = (struct widget_info *)value;
@@ -1256,6 +1288,7 @@ API int widget_viewer_evas_notify_paused_status_of_viewer(void)
                        }
                }
        }
+       pthread_mutex_unlock(&__mutex);
 
        return WIDGET_ERROR_NONE;
 }
@@ -1323,6 +1356,7 @@ static void __del_cb(void *data, Evas *e, Evas_Object *layout, void *event_info)
                return;
        }
 
+       pthread_mutex_lock(&__mutex);
        /* destroy widget info first by removing from hashtable. It will send destroy command to amd */
        if (s_info.widget_table)
                g_hash_table_remove(s_info.widget_table, instance_id);
@@ -1340,6 +1374,7 @@ static void __del_cb(void *data, Evas *e, Evas_Object *layout, void *event_info)
                                g_hash_table_remove(s_info.instance_cnt_table, widget_id);
                }
        }
+       pthread_mutex_unlock(&__mutex);
        __remove_launch_info(instance_id);
 
        free(widget_id);
@@ -1565,10 +1600,12 @@ API Evas_Object *widget_viewer_evas_add_widget(Evas_Object *parent, const char *
                return NULL;
        }
 
+       pthread_mutex_lock(&__mutex);
        max_instance_cnt = widget_service_get_widget_max_count(widget_id);
        if (max_instance_cnt < 0) {
                set_last_result(WIDGET_ERROR_FAULT);/* LCOV_EXCL_LINE */
                LOGE("get widget max instance count fail");/* LCOV_EXCL_LINE */
+               pthread_mutex_unlock(&__mutex);
                return NULL;
        }
 
@@ -1578,6 +1615,7 @@ API Evas_Object *widget_viewer_evas_add_widget(Evas_Object *parent, const char *
                if (cur_instance_cnt == NULL) {
                        LOGE("Fail to calloc instance cnt");
                        set_last_result(WIDGET_ERROR_FAULT);
+                       pthread_mutex_unlock(&__mutex);
                        return NULL;
                }
                *cur_instance_cnt = 0;
@@ -1587,23 +1625,27 @@ API Evas_Object *widget_viewer_evas_add_widget(Evas_Object *parent, const char *
        if (max_instance_cnt != 0 && max_instance_cnt <= *cur_instance_cnt) {
                set_last_result(WIDGET_ERROR_MAX_EXCEEDED);
                LOGE("already have max count instances");
+               pthread_mutex_unlock(&__mutex);
                return NULL;
        }
 
        if (!s_info.initialized) {
                set_last_result(WIDGET_ERROR_FAULT);
                LOGE("Widget viewer evas is not initialized");
+               pthread_mutex_unlock(&__mutex);
                return NULL;
        }
 
        if (widget_instance_create(widget_id, &instance_id) < 0) {
                set_last_result(WIDGET_ERROR_FAULT);/* LCOV_EXCL_LINE */
+               pthread_mutex_unlock(&__mutex);
                return NULL;
        }
 
        if (!instance_id) {
                set_last_result(WIDGET_ERROR_FAULT);
                LOGE("Failed to get instance_id: %s", widget_id);
+               pthread_mutex_unlock(&__mutex);
                return NULL;
        }
 
@@ -1612,6 +1654,7 @@ API Evas_Object *widget_viewer_evas_add_widget(Evas_Object *parent, const char *
                set_last_result(WIDGET_ERROR_FAULT);/* LCOV_EXCL_LINE */
                LOGE("Unable to create an information object");/* LCOV_EXCL_LINE */
                widget_instance_destroy(instance_id);/* LCOV_EXCL_LINE */
+               pthread_mutex_unlock(&__mutex);
                return NULL;
        }
 
@@ -1622,6 +1665,7 @@ API Evas_Object *widget_viewer_evas_add_widget(Evas_Object *parent, const char *
        widget_instance_info->period = period;
 
        g_hash_table_insert(s_info.widget_table, widget_instance_info->instance_id, widget_instance_info);
+       pthread_mutex_unlock(&__mutex);
        widget_service_set_lifecycle_event_cb(widget_id, __lifecycle_event_cb, NULL);
        (*cur_instance_cnt)++;