From 060153934a4fbbec53dca659044bc2c0ae35e8aa Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 13 Nov 2009 17:37:43 +0000 Subject: [PATCH] * ecore: Fix ecore_timer_freeze during timer execution. SVN revision: 43667 --- legacy/ecore/src/lib/ecore/ecore_private.h | 6 ++++-- legacy/ecore/src/lib/ecore/ecore_timer.c | 22 +++++++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/legacy/ecore/src/lib/ecore/ecore_private.h b/legacy/ecore/src/lib/ecore/ecore_private.h index 9a6b1cfabb..eb3249f5fd 100644 --- a/legacy/ecore/src/lib/ecore/ecore_private.h +++ b/legacy/ecore/src/lib/ecore/ecore_private.h @@ -276,11 +276,13 @@ struct _Ecore_Timer double in; double at; double pending; + int (*func) (void *data); + void *data; + unsigned char delete_me : 1; unsigned char just_added : 1; unsigned char frozen : 1; - int (*func) (void *data); - void *data; + unsigned char running : 1; }; struct _Ecore_Idler diff --git a/legacy/ecore/src/lib/ecore/ecore_timer.c b/legacy/ecore/src/lib/ecore/ecore_timer.c index 66fe8e14e1..7a884ac3a4 100644 --- a/legacy/ecore/src/lib/ecore/ecore_timer.c +++ b/legacy/ecore/src/lib/ecore/ecore_timer.c @@ -158,16 +158,16 @@ ecore_timer_del(Ecore_Timer *timer) return NULL; } - if (timer->frozen) + if (timer->frozen && !timer->running) { void *data = timer->data; suspended = (Ecore_Timer *) eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer)); - free(timer); if (timer->delete_me) timers_delete_me--; + free(timer); return data; } @@ -291,7 +291,8 @@ ecore_timer_freeze(Ecore_Timer *timer) if (timer->frozen) return ; - timers = (Ecore_Timer *) eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer)); + if (!timer->running) + timers = (Ecore_Timer *) eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer)); suspended = (Ecore_Timer *) eina_inlist_prepend(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer)); now = ecore_time_get(); @@ -458,6 +459,8 @@ _ecore_timer_call(double when) (timer->just_added == 0) && (timer->delete_me == 0)) { + timer->running = EINA_TRUE; + timers = (Ecore_Timer *) eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer)); _ecore_timer_call(when); if ((!timer->delete_me) && (timer->func(timer->data))) @@ -473,10 +476,15 @@ _ecore_timer_call(double when) */ if (!timer->delete_me) { - if ((timer->at + timer->in) < (when - 15.0)) - _ecore_timer_set(timer, when + timer->in, timer->in, timer->func, timer->data); - else - _ecore_timer_set(timer, timer->at + timer->in, timer->in, timer->func, timer->data); + timer->running = EINA_FALSE; + + if (!timer->frozen) + { + if ((timer->at + timer->in) < (when - 15.0)) + _ecore_timer_set(timer, when + timer->in, timer->in, timer->func, timer->data); + else + _ecore_timer_set(timer, timer->at + timer->in, timer->in, timer->func, timer->data); + } } else free(timer);