Sends restart launch with time interval 12/179512/15
authorhyunho <hhstark.kang@samsung.com>
Fri, 18 May 2018 09:14:14 +0000 (18:14 +0900)
committerhyunho <hhstark.kang@samsung.com>
Thu, 24 May 2018 10:56:47 +0000 (19:56 +0900)
Change-Id: I8019fc1e252c58e8e8c9c9ab03b14abe0a58c16d
Signed-off-by: hyunho <hhstark.kang@samsung.com>
widget_viewer_evas/src/widget_viewer_evas.c

index bb4a50080e61ba8550b47e78d0fe9f64c2c28945..72ede2879b20151d4c490c980fa76ca2eb56aeea 100644 (file)
 #define ERR_BUFFER_SIZE                1024
 
 #define WIDGET_PRIVILEGE "http://tizen.org/privilege/widget.viewer"
+#define WIDGET_RESTART_TIMEOUT 5000
 
 /*!
  * \note
@@ -152,6 +153,8 @@ static struct info {
        Evas_Object *win;
        GHashTable *widget_table;
        GHashTable *instance_cnt_table;
+       GList *restart_list;
+       int restart_timer;
 } s_info = {
        .w = 0,
        .h = 0,
@@ -159,6 +162,8 @@ static struct info {
        .win = NULL,
        .widget_table = NULL,
        .instance_cnt_table = NULL,
+       .restart_list = NULL,
+       .restart_timer = 0
 };
 
 struct pending_item {
@@ -197,6 +202,9 @@ static void __flush_event_queue(struct widget_info *info);
 static int __default_delayed_resuming_time = 100;
 static bool __is_delayed_resuming_mode;
 static void __destroy_widget_info(gpointer data);
+static gboolean __restart_timeout_cb(gpointer user_data);
+static void __remove_restart_info(const char *instance_id);
+static void __restart_instance(void);
 
 static void __destroy_pending_item(gpointer data)
 {
@@ -338,6 +346,25 @@ static void __push_pending_queue(struct widget_info *info,
        LOGD("instance_id(%s), event(%s)", info->instance_id, item->event);
 }
 
+static void __add_restart_list(const char *instance_id)
+{
+       char *restart_instance_id;
+
+       if (!instance_id) {
+               LOGE("Invalid parameter");/* LCOV_EXCL_LINE */
+               return;/* LCOV_EXCL_LINE */
+       }
+
+       restart_instance_id = strdup(instance_id);
+       if (restart_instance_id == NULL) {
+               LOGE("Out Of Memory");
+               return;
+       }
+
+       s_info.restart_list = g_list_append(s_info.restart_list, restart_instance_id);
+       LOGW("add restart(%s)", instance_id);
+}
+
 static inline bool __is_widget_feature_enabled(void)
 {
        static bool feature = false;
@@ -460,6 +487,8 @@ static void __screen_connector_toolkit_evas_added_cb(const char *appid, const ch
 
        info->state = WIDGET_STATE_ATTACHED;
 
+       __remove_restart_info(instance_id);
+       __restart_instance();
        __flush_event_queue(info);
        /**
         * @note
@@ -576,15 +605,79 @@ static void __push_event_queue(struct widget_info *info, int event)
        g_queue_push_tail(info->event_queue, GINT_TO_POINTER(event));
 }
 
+static int __find_restart_info(gconstpointer a, gconstpointer b)
+{
+       if (a == NULL || b == NULL)
+               return -1;
+
+       if (strcmp((const char *)a, (const char *)b) == 0)
+               return 0;
+
+       return -1;
+}
+
+static void __remove_restart_info(const char *instance_id)
+{
+       GList *list;
+       char *restart_instance_id;
+
+       list = g_list_find_custom(s_info.restart_list, instance_id, __find_restart_info);
+       if (list == NULL)
+               return;
+       restart_instance_id = list->data;
+       s_info.restart_list = g_list_remove(s_info.restart_list, restart_instance_id);
+       free(restart_instance_id);
+
+       if (s_info.restart_timer > 0) {
+               g_source_remove(s_info.restart_timer);
+               s_info.restart_timer = 0;
+       }
+}
+
+static void __restart_instance()
+{
+       struct widget_info *info;
+       char *restart_instance_id;
+       int w, h;
+       screen_connector_toolkit_evas_ops ops;
+
+       if (s_info.restart_list == NULL) {
+               LOGW("null restart list");
+               return;
+       }
+
+       restart_instance_id = s_info.restart_list->data;
+       info = g_hash_table_lookup(s_info.widget_table, restart_instance_id);
+       evas_object_geometry_get(info->layout, NULL, NULL, &w, &h);
+       DbgPrint("Widget launch  %s, %d, %d", info->instance_id, w, h);
+
+       ops.added_cb = __screen_connector_toolkit_evas_added_cb;
+       ops.removed_cb = __screen_connector_toolkit_evas_removed_cb;
+       ops.updated_cb = __screen_connector_toolkit_evas_updated_cb;
+
+       if (info->toolkit_h) {
+               screen_connector_toolkit_evas_remove(info->toolkit_h);
+               info->toolkit_h = NULL;
+       }
+
+       info->toolkit_h = screen_connector_toolkit_evas_add(&ops,
+                       info->instance_id,
+                       SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET,
+                       info);
+
+       info->pid = widget_instance_launch(info->instance_id, info->content_info, w, h);
+       info->restart = false;
+
+       s_info.restart_timer = g_timeout_add(WIDGET_RESTART_TIMEOUT,
+                       __restart_timeout_cb, restart_instance_id);
+}
+
 /* LCOV_EXCL_START */
 static int __restart_terminated_widget(const char *widget_id)
 {
-
        GHashTableIter iter;
        gpointer key, value;
-       screen_connector_toolkit_evas_ops ops;
        struct widget_info *widget_instance_info;
-       int w, h;
        int target_pid = 0;
 
        g_hash_table_iter_init(&iter, s_info.widget_table);
@@ -598,7 +691,7 @@ static int __restart_terminated_widget(const char *widget_id)
        }
 
        if (target_pid == 0) {
-               DbgPrint("can not find widget");
+               DbgPrint("can not find widget(%s)", widget_id);
                return 0;
        }
 
@@ -606,33 +699,28 @@ static int __restart_terminated_widget(const char *widget_id)
        while (g_hash_table_iter_next(&iter, &key, &value)) {
                widget_instance_info = (struct widget_info *)value;
                if (widget_instance_info->restart &&
-                               widget_instance_info->pid == target_pid) {
-                       evas_object_geometry_get(widget_instance_info->layout, NULL, NULL, &w, &h);
-                       DbgPrint("Widget launch  %s, %d, %d", widget_instance_info->instance_id, w, h);
-
-                       ops.added_cb = __screen_connector_toolkit_evas_added_cb;
-                       ops.removed_cb = __screen_connector_toolkit_evas_removed_cb;
-                       ops.updated_cb = __screen_connector_toolkit_evas_updated_cb;
-
-                       if (widget_instance_info->toolkit_h) {
-                               screen_connector_toolkit_evas_remove(widget_instance_info->toolkit_h);
-                               widget_instance_info->toolkit_h = NULL;
-                       }
-
-                       widget_instance_info->toolkit_h = screen_connector_toolkit_evas_add(&ops,
-                                       widget_instance_info->instance_id,
-                                       SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET,
-                                       widget_instance_info);
-
-                       widget_instance_info->pid = widget_instance_launch(widget_instance_info->instance_id, widget_instance_info->content_info, w, h);
-                       widget_instance_info->restart = false;
+                               widget_instance_info->pid == target_pid &&
+                               (strcmp(widget_instance_info->widget_id, widget_id) == 0)) {
+                       __add_restart_list(widget_instance_info->instance_id);
                }
        }
+       if (s_info.restart_timer == 0)
+               __restart_instance();
 
        return 0;
 }
 /* LCOV_EXCL_STOP */
 
+static gboolean __restart_timeout_cb(gpointer user_data)
+{
+       char *restart_instance_id = (char *)user_data;
+
+       WarnPrint("Timeout called !! %s", restart_instance_id);
+       __remove_restart_info(restart_instance_id);
+       __restart_instance();
+       return G_SOURCE_REMOVE;
+}
+
 /* LCOV_EXCL_START */
 static int __handle_restart_widget_request(const char *widget_id)
 {
@@ -796,11 +884,9 @@ static int __instance_event_cb(const char *widget_id, const char *instance_id, i
 
 static int __lifecycle_event_cb(const char *widget_id, widget_lifecycle_event_e lifecycle_event, const char *widget_instance_id, void *data)
 {
-       int ret;
        DbgPrint("__lifecycle_event_cb %s (%d)", widget_id, lifecycle_event);
        if (lifecycle_event == WIDGET_LIFE_CYCLE_EVENT_APP_DEAD) {
-               ret = __restart_terminated_widget(widget_id);
-               return ret;
+               __restart_terminated_widget(widget_id);
        }
        return 0;
 }