forked from enlightenment/efl
* ecore: Fix ecore_timer_freeze during timer execution.
SVN revision: 43667
This commit is contained in:
parent
c91bb90bf2
commit
060153934a
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue