Fix widget restart logic 54/184654/1
authorSemun Lee <semun.lee@samsung.com>
Thu, 19 Jul 2018 04:28:53 +0000 (13:28 +0900)
committerSemun Lee <semun.lee@samsung.com>
Fri, 20 Jul 2018 01:30:10 +0000 (01:30 +0000)
- call widget_instance_terminate before requesting restart
- fix to restart only one widget at a time.

Change-Id: Ib33fe11f9488786f81c3322bf052cee66f86f064
Signed-off-by: Semun Lee <semun.lee@samsung.com>
(cherry picked from commit 073508217249d51737081aaece7b2be4514e6946)

widget_viewer_evas/src/widget_viewer_evas.c

index ee3c7797c918079951a9d8437b633198b063a5b7..61af5943875bdfdfa5d79d47f6352f838f170dca 100644 (file)
@@ -130,6 +130,7 @@ static struct info {
        GHashTable *widget_table;
        GHashTable *instance_cnt_table;
        GList *restart_list;
+       char *restarting_instance_id;
        int restart_timer;
 } s_info = {
        .w = 0,
@@ -139,6 +140,7 @@ static struct info {
        .widget_table = NULL,
        .instance_cnt_table = NULL,
        .restart_list = NULL,
+       .restarting_instance_id = NULL,
        .restart_timer = 0
 };
 
@@ -179,6 +181,7 @@ 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 int __find_restart_info(gconstpointer a, gconstpointer b);
 static void __remove_restart_info(const char *instance_id);
 static void __restart_instance(void);
 static void __remove_restart_timer(void);
@@ -325,6 +328,7 @@ static void __push_pending_queue(struct widget_info *info,
 
 static void __add_restart_list(const char *instance_id)
 {
+       GList *list;
        char *restart_instance_id;
 
        if (!instance_id) {
@@ -332,6 +336,12 @@ static void __add_restart_list(const char *instance_id)
                return;/* LCOV_EXCL_LINE */
        }
 
+       list = g_list_find_custom(s_info.restart_list, instance_id, __find_restart_info);
+       if (list != NULL) {
+               LOGW("already in restart list(%s)", instance_id);
+               return;
+       }
+
        restart_instance_id = strdup(instance_id);
        if (restart_instance_id == NULL) {
                LOGE("Out Of Memory");
@@ -439,6 +449,13 @@ static void __screen_connector_toolkit_evas_added_cb(const char *appid, const ch
 
        if (info->restart || (info->instance_id == NULL) || (strcmp(info->instance_id, instance_id) != 0)) {
                LOGE("Wrong added info, %s %s", appid, info->widget_id);/* LCOV_EXCL_LINE */
+
+               if (s_info.restarting_instance_id && info->instance_id &&
+                       strcmp(s_info.restarting_instance_id, info->instance_id) == 0) {
+                       __remove_restart_timer();
+                       __restart_instance();
+               }
+
                return;/* LCOV_EXCL_LINE */
        }
 
@@ -464,9 +481,12 @@ static void __screen_connector_toolkit_evas_added_cb(const char *appid, const ch
 
        info->state = WIDGET_STATE_ATTACHED;
 
-       __remove_restart_info(instance_id);
-       __remove_restart_timer();
-       __restart_instance();
+       if (s_info.restarting_instance_id &&
+               strcmp(s_info.restarting_instance_id, instance_id) == 0) {
+               __remove_restart_info(instance_id);
+               __remove_restart_timer();
+               __restart_instance();
+       }
        __flush_event_queue(info);
        /**
         * @note
@@ -622,9 +642,12 @@ static void __restart_instance()
        struct widget_info *info;
        char *restart_instance_id;
        int w, h;
+       int ret;
        screen_connector_toolkit_evas_ops ops;
 
        if (s_info.restart_list == NULL) {
+               s_info.restarting_instance_id = NULL;
+               s_info.restart_timer = 0;
                LOGW("null restart list");
                return;
        }
@@ -648,8 +671,13 @@ static void __restart_instance()
                        SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET,
                        info);
 
+       ret = widget_instance_terminate(info->instance_id);
+       if (ret != 0)
+               LOGW("widget_instance_terminate failed: %d", ret);
+
        info->pid = widget_instance_launch(info->instance_id, info->content_info, w, h);
        info->restart = false;
+       s_info.restarting_instance_id = restart_instance_id;
 
        s_info.restart_timer = g_timeout_add(WIDGET_RESTART_TIMEOUT,
                        __restart_timeout_cb, restart_instance_id);