discomfitor pushed a commit to branch master.

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

commit a92274f81184cd06b398a0930110f2a4bee49e76
Author: Hosang Kim <hosang12....@samsung.com>
Date:   Thu Aug 2 09:14:15 2018 -0400

    ecore: fix that timers are not called in the order they were registered.
    
    Summary:
    Timers are not called in the order they were registered.
    Because when current timer is deleted, getting next timer is called twice.
    
    Test Plan:
    <error>
    Timer1 expired after 0.001 seconds.
    Timer3 expired after 0.001 seconds.
    Timer5 expired after 0.001 seconds.
    Timer7 expired after 0.001 seconds.
    Timer2 expired after 0.001 seconds.
    Timer6 expired after 0.001 seconds.
    Timer4 expired after 0.001 seconds.
    Timer8 expired after 0.001 seconds.
    <correct>
    Timer1 expired after 0.001 seconds.
    Timer2 expired after 0.001 seconds.
    Timer3 expired after 0.001 seconds.
    Timer4 expired after 0.001 seconds.
    Timer5 expired after 0.001 seconds.
    Timer6 expired after 0.001 seconds.
    Timer7 expired after 0.001 seconds.
    Timer8 expired after 0.001 seconds.|
    
    {F3268233}
    
    Reviewers: Hermet, Jaehyun_Cho, zmike, SanghyeonLee
    
    Reviewed By: zmike
    
    Subscribers: cedric, #committers, zmike
    
    Tags: #efl_tests
    
    Differential Revision: https://phab.enlightenment.org/D6700
---
 src/lib/ecore/ecore_timer.c        | 13 +++++++++++--
 src/tests/ecore/ecore_test_timer.c | 37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/src/lib/ecore/ecore_timer.c b/src/lib/ecore/ecore_timer.c
index 1ebce1f3df..776848875c 100644
--- a/src/lib/ecore/ecore_timer.c
+++ b/src/lib/ecore/ecore_timer.c
@@ -461,11 +461,20 @@ _efl_loop_timer_util_delay(Efl_Loop_Timer_Data *timer, 
double add)
 EOLIAN static void
 _efl_loop_timer_efl_object_parent_set(Eo *obj, Efl_Loop_Timer_Data *pd, 
Efl_Object *parent)
 {
+   Eina_Inlist *first;
+
    efl_parent_set(efl_super(obj, EFL_LOOP_TIMER_CLASS), parent);
 
    if ((!pd->constructed) || (!pd->finalized)) return;
 
-   _efl_loop_timer_util_loop_clear(pd);
+   // Remove the timer from all possible pending list
+   first = eina_inlist_first(EINA_INLIST_GET(pd));
+   if (first == pd->loop_data->timers)
+     pd->loop_data->timers = eina_inlist_remove
+       (pd->loop_data->timers, EINA_INLIST_GET(pd));
+   else if (first == pd->loop_data->suspended)
+     pd->loop_data->suspended = eina_inlist_remove
+       (pd->loop_data->suspended, EINA_INLIST_GET(pd));
 
    if (efl_invalidated_get(obj)) return;
 
@@ -555,7 +564,7 @@ _efl_loop_timer_next_get(Eo *obj, Efl_Loop_Data *pd)
 static inline void
 _efl_loop_timer_reschedule(Efl_Loop_Timer_Data *timer, double when)
 {
-   if (timer->frozen) return;
+   if (timer->frozen || efl_invalidated_get(timer->object)) return;
 
    if (timer->loop_data &&
        (EINA_INLIST_GET(timer)->next || EINA_INLIST_GET(timer)->prev))
diff --git a/src/tests/ecore/ecore_test_timer.c 
b/src/tests/ecore/ecore_test_timer.c
index 7b41b8bc1b..222c4151c5 100644
--- a/src/tests/ecore/ecore_test_timer.c
+++ b/src/tests/ecore/ecore_test_timer.c
@@ -252,10 +252,47 @@ EFL_START_TEST(ecore_test_ecore_main_loop_timer)
 }
 EFL_END_TEST
 
+static int count = 0;
+
+static Eina_Bool
+_timer_cb(void *data)
+{
+   count++;
+   int num = (intptr_t) data;
+   fail_if (num != count, "Error timer is called out of order");
+   if (count == 8) ecore_main_loop_quit();
+   return ECORE_CALLBACK_CANCEL;
+}
+
+EFL_START_TEST(ecore_test_timer_in_order)
+{
+   Ecore_Timer *timer;
+   timer = ecore_timer_add(0.001, _timer_cb, (void *) 1);
+   fail_if(timer == NULL);
+   timer = ecore_timer_add(0.001, _timer_cb, (void *) 2);
+   fail_if(timer == NULL);
+   timer = ecore_timer_add(0.001, _timer_cb, (void *) 3);
+   fail_if(timer == NULL);
+   timer = ecore_timer_add(0.001, _timer_cb, (void *) 4);
+   fail_if(timer == NULL);
+   timer = ecore_timer_add(0.001, _timer_cb, (void *) 5);
+   fail_if(timer == NULL);
+   timer = ecore_timer_add(0.001, _timer_cb, (void *) 6);
+   fail_if(timer == NULL);
+   timer = ecore_timer_add(0.001, _timer_cb, (void *) 7);
+   fail_if(timer == NULL);
+   timer = ecore_timer_add(0.001, _timer_cb, (void *) 8);
+   fail_if(timer == NULL);
+
+   ecore_main_loop_begin();
+}
+EFL_END_TEST
+
 void ecore_test_timer(TCase *tc)
 {
   tcase_add_test(tc, ecore_test_timers);
   tcase_add_test(tc, ecore_test_timer_inside_call);
   tcase_add_test(tc, ecore_test_timer_valid_callbackfunc);
   tcase_add_test(tc, ecore_test_ecore_main_loop_timer);
+  tcase_add_test(tc, ecore_test_timer_in_order);
 }

-- 


Reply via email to