From: hyunho Date: Fri, 12 Jun 2020 08:07:43 +0000 (+0900) Subject: Add mutex lock to support mutithreads apps X-Git-Tag: submit/tizen/20200615.073523~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=92b0ea95ebd1e086b8267572bb8630169dbac72c;p=platform%2Fcore%2Fappfw%2Fwidget-viewer.git Add mutex lock to support mutithreads apps Change-Id: I6004a4992c3057a7014f3ba63947a7e3b4f5099d Signed-off-by: hyunho --- diff --git a/widget_viewer_evas/src/widget_viewer_evas.c b/widget_viewer_evas/src/widget_viewer_evas.c index 870892fc..b0e4c6f8 100644 --- a/widget_viewer_evas/src/widget_viewer_evas.c +++ b/widget_viewer_evas/src/widget_viewer_evas.c @@ -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)++;