* ecore: Fix ecore_timer_freeze during timer execution.

SVN revision: 43667
This commit is contained in:
Cedric BAIL 2009-11-13 17:37:43 +00:00
parent c91bb90bf2
commit 060153934a
2 changed files with 19 additions and 9 deletions

View File

@ -276,11 +276,13 @@ struct _Ecore_Timer
double in; double in;
double at; double at;
double pending; double pending;
int (*func) (void *data);
void *data;
unsigned char delete_me : 1; unsigned char delete_me : 1;
unsigned char just_added : 1; unsigned char just_added : 1;
unsigned char frozen : 1; unsigned char frozen : 1;
int (*func) (void *data); unsigned char running : 1;
void *data;
}; };
struct _Ecore_Idler struct _Ecore_Idler

View File

@ -158,16 +158,16 @@ ecore_timer_del(Ecore_Timer *timer)
return NULL; return NULL;
} }
if (timer->frozen) if (timer->frozen && !timer->running)
{ {
void *data = timer->data; void *data = timer->data;
suspended = (Ecore_Timer *) eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer)); suspended = (Ecore_Timer *) eina_inlist_remove(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer));
free(timer);
if (timer->delete_me) if (timer->delete_me)
timers_delete_me--; timers_delete_me--;
free(timer);
return data; return data;
} }
@ -291,7 +291,8 @@ ecore_timer_freeze(Ecore_Timer *timer)
if (timer->frozen) if (timer->frozen)
return ; 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)); suspended = (Ecore_Timer *) eina_inlist_prepend(EINA_INLIST_GET(suspended), EINA_INLIST_GET(timer));
now = ecore_time_get(); now = ecore_time_get();
@ -458,6 +459,8 @@ _ecore_timer_call(double when)
(timer->just_added == 0) && (timer->just_added == 0) &&
(timer->delete_me == 0)) (timer->delete_me == 0))
{ {
timer->running = EINA_TRUE;
timers = (Ecore_Timer *) eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer)); timers = (Ecore_Timer *) eina_inlist_remove(EINA_INLIST_GET(timers), EINA_INLIST_GET(timer));
_ecore_timer_call(when); _ecore_timer_call(when);
if ((!timer->delete_me) && (timer->func(timer->data))) if ((!timer->delete_me) && (timer->func(timer->data)))
@ -473,10 +476,15 @@ _ecore_timer_call(double when)
*/ */
if (!timer->delete_me) if (!timer->delete_me)
{ {
if ((timer->at + timer->in) < (when - 15.0)) timer->running = EINA_FALSE;
_ecore_timer_set(timer, when + timer->in, timer->in, timer->func, timer->data);
else if (!timer->frozen)
_ecore_timer_set(timer, timer->at + timer->in, timer->in, timer->func, timer->data); {
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 else
free(timer); free(timer);