void _ecore_idle_exiter_call(void) { if (!idle_exiter_current) { /* regular main loop, start from head */ idle_exiter_current = idle_exiters; } else { /* recursive main loop, continue from where we were */ idle_exiter_current = (Ecore_Idle_Exiter *)EINA_INLIST_GET(idle_exiter_current)->next; } while (idle_exiter_current) { Ecore_Idle_Exiter *ie = (Ecore_Idle_Exiter *)idle_exiter_current; if (!ie->delete_me) { ie->references++; if (!_ecore_call_task_cb(ie->func, ie->data)) { if (!ie->delete_me) _ecore_idle_exiter_del(ie); } ie->references--; } if (idle_exiter_current) /* may have changed in recursive main loops */ idle_exiter_current = (Ecore_Idle_Exiter *)EINA_INLIST_GET(idle_exiter_current)->next; } if (idle_exiters_delete_me) { Ecore_Idle_Exiter *l; int deleted_idler_exiters_in_use = 0; for (l = idle_exiters; l; ) { Ecore_Idle_Exiter *ie = l; l = (Ecore_Idle_Exiter *)EINA_INLIST_GET(l)->next; if (ie->delete_me) { if (ie->references) { deleted_idler_exiters_in_use++; continue; } idle_exiters = (Ecore_Idle_Exiter *)eina_inlist_remove(EINA_INLIST_GET(idle_exiters), EINA_INLIST_GET(ie)); ECORE_MAGIC_SET(ie, ECORE_MAGIC_NONE); ecore_idle_exiter_mp_free(ie); } } if (!deleted_idler_exiters_in_use) idle_exiters_delete_me = 0; } }
static Eina_Bool _do_tick(void) { Ecore_Animator *animator; EINA_INLIST_FOREACH(animators, animator) { animator->just_added = EINA_FALSE; } EINA_INLIST_FOREACH(animators, animator) { if ((!animator->delete_me) && (!animator->suspended) && (!animator->just_added)) { if (!_ecore_call_task_cb(animator->func, animator->data)) { animator->delete_me = EINA_TRUE; animators_delete_me++; } } else animator->just_added = EINA_FALSE; } 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) { animators = (Ecore_Animator *) eina_inlist_remove(EINA_INLIST_GET(animators), EINA_INLIST_GET(animator)); ECORE_MAGIC_SET(animator, ECORE_MAGIC_NONE); ecore_animator_mp_free(animator); animators_delete_me--; if (animators_delete_me == 0) break; } } } if (!animators) { _end_tick(); return ECORE_CALLBACK_CANCEL; } return ECORE_CALLBACK_RENEW; }
int _ecore_idler_all_call(void) { if (!idler_current) { /* regular main loop, start from head */ idler_current = idlers; } else { /* recursive main loop, continue from where we were */ idler_current = (Ecore_Idler_Data *)EINA_INLIST_GET(idler_current)->next; } while (idler_current) { Ecore_Idler_Data *ie = (Ecore_Idler_Data *)idler_current; if (!ie->delete_me) { ie->references++; eina_evlog("+idler", ie, 0.0, NULL); if (!_ecore_call_task_cb(ie->func, ie->data)) { if (!ie->delete_me) _ecore_idler_del(ie->obj); } eina_evlog("-idler", ie, 0.0, NULL); ie->references--; } if (idler_current) /* may have changed in recursive main loops */ idler_current = (Ecore_Idler_Data *)EINA_INLIST_GET(idler_current)->next; } if (idlers_delete_me) { Ecore_Idler_Data *l; int deleted_idlers_in_use = 0; for (l = idlers; l; ) { Ecore_Idler_Data *ie = l; l = (Ecore_Idler_Data *)EINA_INLIST_GET(l)->next; if (ie->delete_me) { if (ie->references) { deleted_idlers_in_use++; continue; } idlers = (Ecore_Idler_Data *)eina_inlist_remove(EINA_INLIST_GET(idlers), EINA_INLIST_GET(ie)); eo_do(ie->obj, eo_parent_set(NULL)); if (eo_destructed_is(ie->obj)) eo_manual_free(ie->obj); else eo_manual_free_set(ie->obj, EINA_FALSE); } } if (!deleted_idlers_in_use) idlers_delete_me = 0; } if (idlers) return 1; return 0; }