From 427d8c21f9de1192b5aa845e35aa9deb5883426d 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 Change-Id: If6a0f50d4d90b31305e00dafebbbd2250d00ec2f Signed-off-by: Mykyta Biliavskyi --- src/lib/ecore/ecore_anim.c | 74 ++++++++++++++++++++++++------------------- src/lib/ecore/ecore_main.c | 6 +++- src/lib/ecore/ecore_private.h | 2 ++ 3 files changed, 49 insertions(+), 33 deletions(-) diff --git a/src/lib/ecore/ecore_anim.c b/src/lib/ecore/ecore_anim.c index 05a95e2..6b53447 100644 --- a/src/lib/ecore/ecore_anim.c +++ b/src/lib/ecore/ecore_anim.c @@ -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" diff --git a/src/lib/ecore/ecore_main.c b/src/lib/ecore/ecore_main.c index d1df901..e02119a 100644 --- a/src/lib/ecore/ecore_main.c +++ b/src/lib/ecore/ecore_main.c @@ -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--; } diff --git a/src/lib/ecore/ecore_private.h b/src/lib/ecore/ecore_private.h index eab53dd..5aaa8c9 100644 --- a/src/lib/ecore/ecore_private.h +++ b/src/lib/ecore/ecore_private.h @@ -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); -- 2.7.4