cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=fd5d31696d834a6c0fad3fe89cfb523899c04531

commit fd5d31696d834a6c0fad3fe89cfb523899c04531
Author: Cedric BAIL <ced...@osg.samsung.com>
Date:   Wed Jul 13 15:09:03 2016 -0700

    ecore: early destruction of animator allow for tick end to always be 
triggered.
    
    T4043
---
 src/lib/ecore/ecore_anim.c    | 68 +++++++++++++++++++++++++------------------
 src/lib/ecore/ecore_main.c    |  5 +++-
 src/lib/ecore/ecore_private.h |  2 ++
 3 files changed, 46 insertions(+), 29 deletions(-)

diff --git a/src/lib/ecore/ecore_anim.c b/src/lib/ecore/ecore_anim.c
index fc8eb88..dedea47 100644
--- a/src/lib/ecore/ecore_anim.c
+++ b/src/lib/ecore/ecore_anim.c
@@ -277,8 +277,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;
@@ -292,32 +292,8 @@ _do_tick(void)
           }
         else animator->just_added = EINA_FALSE;
      }
-   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 ECORE_CALLBACK_CANCEL;
-     }
+   if (!_ecore_animator_flush())
+     return ECORE_CALLBACK_CANCEL;
    return ECORE_CALLBACK_RENEW;
 }
 
@@ -635,6 +611,7 @@ ecore_animator_del(Ecore_Animator *animator)
         data = animator->data;
         goto end;
      }
+
    animator->delete_me = EINA_TRUE;
    animators_delete_me++;
    if (animator->run_func)
@@ -643,6 +620,7 @@ ecore_animator_del(Ecore_Animator *animator)
      data = animator->data;
 
  end:
+   if (!in_main_loop) _ecore_animator_flush();
    return data;
 }
 
@@ -786,3 +764,37 @@ _ecore_animator_run(void *data)
    if (t >= (animator->start + animator->run)) run_ret = EINA_FALSE;
    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;
+}
diff --git a/src/lib/ecore/ecore_main.c b/src/lib/ecore/ecore_main.c
index 354edc9..d16c97a 100644
--- a/src/lib/ecore/ecore_main.c
+++ b/src/lib/ecore/ecore_main.c
@@ -273,8 +273,9 @@ static int _ecore_main_win32_select(int             nfds,
 static void _ecore_main_win32_handlers_cleanup(void);
 #endif
 
+int in_main_loop = 0;
+
 static unsigned char _ecore_exit_code = 0;
-static int in_main_loop = 0;
 static int do_quit = 0;
 static Ecore_Fd_Handler *fd_handlers = NULL;
 static Ecore_Fd_Handler *fd_handler_current = NULL;
@@ -2351,6 +2352,8 @@ process_all: 
/*-*********************************************************/
      }
 
 done: /*-*****************************************************************/
+   /* Agressively flush animator */
+   _ecore_animator_flush();
    in_main_loop--;
 }
 
diff --git a/src/lib/ecore/ecore_private.h b/src/lib/ecore/ecore_private.h
index 40fa080..d6cb900 100644
--- a/src/lib/ecore/ecore_private.h
+++ b/src/lib/ecore/ecore_private.h
@@ -248,6 +248,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);
 
@@ -336,6 +337,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);

-- 


Reply via email to