Add ANR logic for launched widget 57/199557/3
authorhyunho <hhstark.kang@samsung.com>
Wed, 13 Feb 2019 04:41:33 +0000 (13:41 +0900)
committerhyunho <hhstark.kang@samsung.com>
Wed, 13 Feb 2019 08:15:19 +0000 (17:15 +0900)
Change-Id: I3266181d518c071e8edfe204457c6b79d488ba9c
Signed-off-by: hyunho <hhstark.kang@samsung.com>
widget_viewer_evas/src/widget_viewer_evas.c

index 3610b429c29424f0bb5cbd0a35d37ab937b6aee6..e7e5d6c5ae318d869d62f26a72cf426d486228eb 100644 (file)
 #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 {