Add flush timer 09/170809/1
authorHwankyu Jhun <h.jhun@samsung.com>
Thu, 22 Feb 2018 08:23:00 +0000 (17:23 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 22 Feb 2018 08:23:00 +0000 (17:23 +0900)
When all instances are paused, appcore_multiwindow_base adds
the timer to flush memory.

Change-Id: I778b946079f147d34b89684ae0569bfcda03c004
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/multiwindow_base/appcore_multiwindow_base_window.c

index cb2061c..8a980ce 100644 (file)
@@ -37,6 +37,7 @@ typedef struct _win_context {
 } win_context;
 
 static GList *__win_contexts;
+static guint __flush_timer;
 
 static gint __comp(gconstpointer a, gconstpointer b)
 {
@@ -85,6 +86,47 @@ static win_context *__find_win_context_by_wid(int wid)
        return node->data;
 }
 
+static bool __is_resumed(void)
+{
+       win_context *ctx;
+       GList *iter;
+
+       iter = __win_contexts;
+       while (iter) {
+               ctx = (win_context *)iter->data;
+               if (appcore_multiwindow_base_instance_is_resumed(ctx->inst))
+                       return true;
+               iter = g_list_next(iter);
+       }
+
+       return false;
+}
+
+static gboolean __flush_memory(gpointer data)
+{
+       _DBG("Flush memory");
+       appcore_base_flush_memory();
+       __flush_timer = 0;
+       return G_SOURCE_REMOVE;
+}
+
+static void __add_flush_timer(void)
+{
+       if (__flush_timer)
+               return;
+
+       __flush_timer = g_timeout_add(5000, __flush_memory, NULL);
+}
+
+static void __remove_flush_timer(void)
+{
+       if (!__flush_timer)
+               return;
+
+       g_source_remove(__flush_timer);
+       __flush_timer = 0;
+}
+
 EXPORT_API void appcore_multiwindow_base_window_on_show(int type, void *event)
 {
 }
@@ -113,10 +155,14 @@ EXPORT_API void appcore_multiwindow_base_window_on_visibility(int type, void *ev
        if (!cxt)
                return;
 
-       if (ev->fully_obscured)
+       if (ev->fully_obscured) {
                appcore_multiwindow_base_instance_pause(cxt->inst);
-       else
+               if (!__is_resumed())
+                       __add_flush_timer();
+       } else {
                appcore_multiwindow_base_instance_resume(cxt->inst);
+               __remove_flush_timer();
+       }
 }
 
 EXPORT_API void appcore_multiwindow_base_window_on_pre_visibility(int type, void *event)
@@ -127,8 +173,10 @@ EXPORT_API void appcore_multiwindow_base_window_on_pre_visibility(int type, void
        if (!cxt)
                return;
 
-       if (ev->type == ECORE_WL_WINDOW_VISIBILITY_TYPE_PRE_UNOBSCURED)
+       if (ev->type == ECORE_WL_WINDOW_VISIBILITY_TYPE_PRE_UNOBSCURED) {
                appcore_multiwindow_base_instance_resume(cxt->inst);
+               __remove_flush_timer();
+       }
 }
 
 EXPORT_API void appcore_multiwindow_base_window_bind(appcore_multiwindow_base_instance_h h, Ecore_Wl_Window *wl_win)