From fd5d31696d834a6c0fad3fe89cfb523899c04531 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Wed, 13 Jul 2016 15:09:03 -0700 Subject: [PATCH] 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 fc8eb88d2c..dedea476f9 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 354edc9ae4..d16c97a7de 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 40fa0807e2..d6cb900a72 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);