ecore: early destruction of animator allow for tick end to always be triggered. 28/91228/2
authorCedric BAIL <cedric@osg.samsung.com>
Wed, 13 Jul 2016 22:09:03 +0000 (15:09 -0700)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Tue, 22 Nov 2016 01:31:54 +0000 (17:31 -0800)
T4043

Change-Id: If6a0f50d4d90b31305e00dafebbbd2250d00ec2f
Signed-off-by: Mykyta Biliavskyi <m.biliavskyi@samsung.com>
src/lib/ecore/ecore_anim.c
src/lib/ecore/ecore_main.c
src/lib/ecore/ecore_private.h

index 05a95e2..6b53447 100644 (file)
@@ -290,8 +290,8 @@ _do_tick(void)
    if (animators) eina_evlog("!FRAME", NULL, ecore_loop_time_get(), NULL);
    EINA_INLIST_FOREACH(animators, animator)
      {
-        if ((!animator->delete_me) && 
-            (!animator->suspended) && 
+        if ((!animator->delete_me) &&
+            (!animator->suspended) &&
             (!animator->just_added))
           {
              animator_ran = EINA_TRUE;
@@ -305,36 +305,8 @@ _do_tick(void)
           }
         else animator->just_added = EINA_FALSE;
      }
-   if (animators_delete_me)
-     {
-        Ecore_Animator_Data *l;
-        for (l = animators; l; )
-          {
-             animator = l;
-             l = (Ecore_Animator_Data *)EINA_INLIST_GET(l)->next;
-             if (animator->delete_me)
-               {
-                  if (animator->suspended) animators_suspended--;
-                  animators = (Ecore_Animator_Data *)
-                    eina_inlist_remove(EINA_INLIST_GET(animators),
-                                       EINA_INLIST_GET(animator));
-
-                  eo_do(animator->obj, eo_parent_set(NULL));
-                  if (eo_destructed_is(animator->obj))
-                     eo_manual_free(animator->obj);
-                  else
-                     eo_manual_free_set(animator->obj, EINA_FALSE);
-
-                  animators_delete_me--;
-                  if (animators_delete_me == 0) break;
-               }
-          }
-     }
-   if (!_have_animators())
-     {
-        _end_tick();
-        return ECORE_CALLBACK_CANCEL;
-     }
+   if (!_ecore_animator_flush())
+     return ECORE_CALLBACK_CANCEL;
    return ECORE_CALLBACK_RENEW;
 }
 
@@ -676,14 +648,19 @@ ecore_animator_del(Ecore_Animator *obj)
         data = animator->data;
         goto unlock;
      }
+
    animator->delete_me = EINA_TRUE;
    animators_delete_me++;
    if (animator->run_func)
      data = animator->run_data;
    else
      data = animator->data;
+
 unlock:
    _ecore_unlock();
+
+ end:
+   if (!in_main_loop) _ecore_animator_flush();
    return data;
 }
 
@@ -883,4 +860,37 @@ _ecore_animator_run(void *data)
    return run_ret;
 }
 
+Eina_Bool
+_ecore_animator_flush(void)
+{
+   Ecore_Animator *animator;
+
+   if (animators_delete_me)
+     {
+        Ecore_Animator *l;
+        for (l = animators; l; )
+          {
+             animator = l;
+             l = (Ecore_Animator  *)EINA_INLIST_GET(l)->next;
+             if (animator->delete_me)
+               {
+                  if (animator->suspended) animators_suspended--;
+                  animators = (Ecore_Animator *)
+                    eina_inlist_remove(EINA_INLIST_GET(animators),
+                                       EINA_INLIST_GET(animator));
+
+                  free(animator);
+
+                  animators_delete_me--;
+                  if (animators_delete_me == 0) break;
+               }
+          }
+     }
+   if (!_have_animators())
+     {
+        _end_tick();
+        return EINA_FALSE;
+     }
+   return EINA_TRUE;
+}
 #include "ecore_animator.eo.c"
index d1df901..e02119a 100644 (file)
@@ -224,7 +224,9 @@ static int _ecore_main_win32_select(int             nfds,
 static void _ecore_main_win32_handlers_cleanup(void);
 #endif
 
-static int in_main_loop = 0;
+int in_main_loop = 0;
+
+static unsigned char _ecore_exit_code = 0;
 static int do_quit = 0;
 static Ecore_Fd_Handler *fd_handlers = NULL;
 static Ecore_Fd_Handler *fd_handler_current = NULL;
@@ -2040,6 +2042,8 @@ process_all: /*-*********************************************************/
      }
 
 done: /*-*****************************************************************/
+   /* Agressively flush animator */
+   _ecore_animator_flush();
    in_main_loop--;
 }
 
index eab53dd..5aaa8c9 100644 (file)
@@ -259,6 +259,7 @@ void       _ecore_exe_event_del_free(void *data,
 void _ecore_animator_shutdown(void);
 void _ecore_animator_run_reset(void);
 Eina_Bool _ecore_animator_run_get(void);
+Eina_Bool _ecore_animator_flush(void);
 
 void _ecore_poller_shutdown(void);
 
@@ -434,6 +435,7 @@ extern int _ecore_fps_debug;
 extern double _ecore_time_loop_time;
 extern Eina_Bool _ecore_glib_always_integrate;
 extern Ecore_Select_Function main_loop_select;
+extern int in_main_loop;
 
 Eina_Bool ecore_mempool_init(void);
 void ecore_mempool_shutdown(void);