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)
{
}
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);
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)",
info->pid = -1;
info->is_faulted = true;
__display_overlay_text(info);
+ pthread_mutex_unlock(&__mutex);
}
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 */
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;
}
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;
if (target_pid == 0) {
LOGW("can not find widget(%s)", widget_id);
+ pthread_mutex_unlock(&__mutex);
return 0;
}
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;
}
__add_launch_list(instance_id);
}
__launch_instance();
-
+ pthread_mutex_unlock(&__mutex);
return 0;
}
/* LCOV_EXCL_STOP */
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;
if (target_pid == 0) {
LOGW("can not find widget (%s)", widget_id);
+ pthread_mutex_unlock(&__mutex);
return 0;
}
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 */
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 */
}
event != WIDGET_INSTANCE_EVENT_CREATE_ABORTED) {
if (info->state == WIDGET_STATE_DETACHED) {
__push_event_queue(info, event);
+ pthread_mutex_unlock(&__mutex);
return 0;
}
}
__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;
}
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;
_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;
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);
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);
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;
}
}
}
+ pthread_mutex_unlock(&__mutex);
return WIDGET_ERROR_NONE;
}
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;
}
}
}
+ pthread_mutex_unlock(&__mutex);
return WIDGET_ERROR_NONE;
}
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);
g_hash_table_remove(s_info.instance_cnt_table, widget_id);
}
}
+ pthread_mutex_unlock(&__mutex);
__remove_launch_info(instance_id);
free(widget_id);
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;
}
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;
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;
}
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;
}
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)++;