From: hyunho Date: Wed, 13 Feb 2019 04:41:33 +0000 (+0900) Subject: Add ANR logic for launched widget X-Git-Tag: submit/tizen/20190215.081656~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=97d25ee58671bada364a6e02612e403f0df67201;p=platform%2Fcore%2Fappfw%2Fwidget-viewer.git Add ANR logic for launched widget Change-Id: I3266181d518c071e8edfe204457c6b79d488ba9c 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 3610b429..e7e5d6c5 100644 --- a/widget_viewer_evas/src/widget_viewer_evas.c +++ b/widget_viewer_evas/src/widget_viewer_evas.c @@ -106,7 +106,8 @@ #define ERR_BUFFER_SIZE 1024 #define WIDGET_PRIVILEGE "http://tizen.org/privilege/widget.viewer" -#define WIDGET_LAUNCH_TIMEOUT 5000 +#define WIDGET_LAUNCH_TIMEOUT 7000 +#define MAX_NO_RESPONSE_COUNT 2 /*! * \note @@ -174,6 +175,7 @@ struct widget_info { GQueue *pending_queue; bool is_faulted; screen_connector_toolkit_evas_h toolkit_h; + int no_response_count; }; static void __flush_event_queue(struct widget_info *info); @@ -480,6 +482,7 @@ static void __screen_connector_toolkit_evas_added_cb(const char *appid, const ch elm_object_signal_emit(info->layout, "disable", "overlay,text"); info->state = WIDGET_STATE_ATTACHED; + info->no_response_count = 0; if (s_info.launching_instance_id && strcmp(s_info.launching_instance_id, instance_id) == 0) { __remove_launch_info(instance_id); @@ -603,6 +606,21 @@ static void __display_overlay_text(struct widget_info *info) } /* LCOV_EXCL_STOP */ +/* LCOV_EXCL_START */ +static void __display_loading_text(struct widget_info *info) +{ + if (!info->disable_preview) { + __create_preview_image(info->layout, info->widget_id); + elm_object_signal_emit(info->layout, "enable", "preview"); + } + + if (!info->disable_loading) { + elm_object_part_text_set(info->layout, "text", T_("IDS_ST_POP_LOADING_ING")); + elm_object_signal_emit(info->layout, "enable", "text"); + } +} +/* LCOV_EXCL_STOP */ + static void __push_event_queue(struct widget_info *info, int event) { if (info->event_queue == NULL) @@ -667,6 +685,10 @@ static void __launch_instance() instance_id = s_info.launch_list->data; info = g_hash_table_lookup(s_info.widget_table, instance_id); + if (info == NULL) { + LOGW("can not find instance (%s)", instance_id); + return; + } evas_object_geometry_get(info->layout, NULL, NULL, &w, &h); LOGD("Widget launch %s, %d, %d", info->instance_id, w, h); @@ -690,6 +712,7 @@ static void __launch_instance() LOGW("widget_instance_terminate failed: %d", ret); } + __display_loading_text(info); info->pid = widget_instance_launch(info->instance_id, info->content_info, w, h); info->restart = false; if (info->pid < 0) { @@ -735,6 +758,12 @@ static int __restart_terminated_widget(const char *widget_id) return 0; } + if (widget_instance_info->no_response_count >= MAX_NO_RESPONSE_COUNT) { + LOGE("WIDGET IS NOT RESPONDING(%s) STOP AUTO RESTART", widget_id); + widget_instance_info->no_response_count = 0; + return 0; + } + 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; @@ -754,9 +783,20 @@ static int __restart_terminated_widget(const char *widget_id) static gboolean __launch_timeout_cb(gpointer user_data) { char *instance_id = (char *)user_data; + struct widget_info *info; LOGW("Timeout called !! %s", instance_id); + info = g_hash_table_lookup(s_info.widget_table, instance_id); + if (!info) + LOGE("Unable to find a proper instance");/* LCOV_EXCL_LINE */ + __remove_launch_info(instance_id); + if (info && info->no_response_count < MAX_NO_RESPONSE_COUNT) { + info->no_response_count++; + LOGW("Widget is not responding(%d) !! %s(%d)", + info->no_response_count, instance_id, info->pid); + aul_terminate_pid(info->pid); + } __launch_instance(); return G_SOURCE_REMOVE; } @@ -1218,12 +1258,7 @@ static void __resize_cb(void *data, Evas *e, Evas_Object *layout, void *event_in * @note * Create a new instance in this case. */ - if (!info->disable_preview) - __create_preview_image(layout, info->widget_id); - - if (!info->disable_loading) - elm_object_part_text_set(layout, "text", T_("IDS_ST_POP_LOADING_ING")); - + __display_loading_text(info); __add_launch_list(info->instance_id); if (s_info.launch_timer == 0) __launch_instance(); @@ -1284,16 +1319,7 @@ static void __move_cb(void *data, Evas *e, Evas_Object *layout, void *event_info if (info->pid < 0) { info->restart = true; LOGD("restart! %s", info->widget_id); - if (!info->disable_preview) { - __create_preview_image(info->layout, info->widget_id); - elm_object_signal_emit(info->layout, "enable", "preview"); - } - - if (!info->disable_loading) { - elm_object_part_text_set(info->layout, "text", T_("IDS_ST_POP_LOADING_ING")); - elm_object_signal_emit(info->layout, "enable", "text"); - } - + __display_loading_text(info); __restart_terminated_widget(info->widget_id); } } @@ -1391,6 +1417,7 @@ static struct widget_info *create_info(Evas_Object *parent, const char *widget_i info->state = WIDGET_STATE_DETACHED; info->event_queue = NULL; info->restart = false; + info->no_response_count = 0; return info; @@ -2051,15 +2078,7 @@ API void widget_viewer_evas_activate_faulted_widget(Evas_Object *widget) __FUNCTION__, __LINE__, info->instance_id, info->pid); if (info->pid < 0) { evas_object_geometry_get(info->layout, NULL, NULL, &w, &h); - if (!info->disable_preview) { - __create_preview_image(info->layout, info->widget_id); - elm_object_signal_emit(info->layout, "enable", "preview"); - } - - if (!info->disable_loading) { - elm_object_part_text_set(info->layout, "text", T_("IDS_ST_POP_LOADING_ING")); - elm_object_signal_emit(info->layout, "enable", "text"); - } + __display_loading_text(info); __add_launch_list(info->instance_id); __launch_instance(); } else {