zmike pushed a commit to branch efl-1.22. http://git.enlightenment.org/core/efl.git/commit/?id=b5d565bed635268227adc27697ccc2557d90bfff
commit b5d565bed635268227adc27697ccc2557d90bfff Author: Cedric BAIL <cedric.b...@free.fr> Date: Thu Mar 28 17:18:08 2019 -0700 ecore: rely on event instead of creating one Eo object per future that need resolving. This was a terrible oversight, but the point of having a small native type for future was for making them efficient. Still we were using one Eo object for dispatching per future to dispatch new value. I could have gathered all the dispatch with just one object, but at the end we do have one object that notify us of the loop iteration... the loop object! And we have event on that object that we can rely to trigger the dispatching of future without requiring any additional object. So let's do that instead. Reviewed-by: Marcel Hollerbach <m...@marcel-hollerbach.de> Differential Revision: https://phab.enlightenment.org/D8567 --- src/lib/ecore/ecore_events.c | 105 ++++++++++++++++++------------------------ src/lib/ecore/ecore_private.h | 2 + 2 files changed, 48 insertions(+), 59 deletions(-) diff --git a/src/lib/ecore/ecore_events.c b/src/lib/ecore/ecore_events.c index 15667e9bd9..01a4c3d019 100644 --- a/src/lib/ecore/ecore_events.c +++ b/src/lib/ecore/ecore_events.c @@ -12,16 +12,13 @@ typedef struct _Ecore_Future_Schedule_Entry Eina_Future_Schedule_Entry base; Eina_Future_Scheduler_Cb cb; Eina_Future *future; - Eo *event; Eina_Value value; } Ecore_Future_Schedule_Entry; ////// // XXX: still using legacy ecore events -//static Ecore_Event_Handler *future_handler = NULL; static Eina_Bool shutting_down = EINA_FALSE; static Eina_Mempool *mp_future_schedule_entry = NULL; -//static int ECORE_EV_FUTURE_ID = -1; // ////// @@ -129,52 +126,47 @@ ecore_event_current_event_get(void) return ecore_event_message_handler_current_event_get(_event_msg_handler); } -/* XXX: -static Eina_Bool -ecore_future_dispatched(void *data EINA_UNUSED, - int type EINA_UNUSED, - void *event) -{ - Ecore_Future_Schedule_Entry *entry = event; - EINA_SAFETY_ON_NULL_RETURN_VAL(entry, EINA_FALSE); +static void _future_dispatch_cb(void *data, const Efl_Event *ev EINA_UNUSED); +static void _event_del_cb(void *data, const Efl_Event *ev); - entry->event = NULL; - entry->cb(entry->future, entry->value); - return EINA_FALSE; -} +EFL_CALLBACKS_ARRAY_DEFINE(ecore_future_callbacks, + { EFL_LOOP_EVENT_IDLE_ENTER, _future_dispatch_cb }, + { EFL_LOOP_EVENT_IDLE, _future_dispatch_cb }, + { EFL_EVENT_DEL, _event_del_cb }); static void -ecore_future_free(void *user_data, - void *func_data EINA_UNUSED) +_future_dispatch_cb(void *data, const Efl_Event *ev EINA_UNUSED) { - Ecore_Future_Schedule_Entry *entry = user_data; - if (entry->event) + Efl_Loop_Future_Scheduler *loopsched = data; + Eina_List *entries = loopsched->future_entries; + Ecore_Future_Schedule_Entry *entry; + + loopsched->future_entries = NULL; + efl_event_callback_array_del((Eo *) loopsched->loop, ecore_future_callbacks(), loopsched); + + EINA_LIST_FREE(entries, entry) { - eina_future_cancel(entry->future); - eina_value_flush(&entry->value); + entry->cb(entry->future, entry->value); + eina_mempool_free(mp_future_schedule_entry, entry); } - eina_mempool_free(mp_future_schedule_entry, entry); } -*/ static void -_future_dispatch_cb(void *data, const Efl_Event *ev EINA_UNUSED) +_event_del_cb(void *data, const Efl_Event *ev EINA_UNUSED) { - Ecore_Future_Schedule_Entry *entry = data; - entry->event = NULL; - entry->cb(entry->future, entry->value); -} + Efl_Loop_Future_Scheduler *loopsched = data; + Eina_List *entries = loopsched->future_entries; + Ecore_Future_Schedule_Entry *entry; -static void -_event_del_cb(void *data, const Efl_Event *ev) -{ - Ecore_Future_Schedule_Entry *entry = data; - if ((ev->object == (Eo *) entry->event) && entry->future) + loopsched->future_entries = NULL; + efl_event_callback_array_del((Eo *) loopsched->loop, ecore_future_callbacks(), loopsched); + + EINA_LIST_FREE(entries, entry) { eina_future_cancel(entry->future); eina_value_flush(&entry->value); + eina_mempool_free(mp_future_schedule_entry, entry); } - eina_mempool_free(mp_future_schedule_entry, entry); } static Eina_Future_Schedule_Entry * @@ -192,40 +184,35 @@ ecore_future_schedule(Eina_Future_Scheduler *sched, entry->cb = cb; entry->future = future; entry->value = value; - entry->event = efl_loop_message_future_handler_message_type_add - (loopsched->loop_data->future_message_handler); - EINA_SAFETY_ON_NULL_GOTO(entry->event, err); - efl_loop_message_future_data_set(entry->event, entry); - efl_loop_message_handler_message_send - (loopsched->loop_data->future_message_handler, entry->event); -// XXX: -// entry->event = ecore_event_add(ECORE_EV_FUTURE_ID, entry, -// ecore_future_free, entry); - efl_event_callback_add((Eo *)entry->event, EFL_LOOP_MESSAGE_EVENT_MESSAGE, - _future_dispatch_cb, entry); - efl_event_callback_add((Eo *)entry->event, EFL_EVENT_DEL, - _event_del_cb, entry); - return &entry->base; - err: - eina_mempool_free(mp_future_schedule_entry, entry); - return NULL; + if (!loopsched->future_entries) + efl_event_callback_array_add((Eo *) loopsched->loop, ecore_future_callbacks(), loopsched); + + loopsched->future_entries = eina_list_append(loopsched->future_entries, entry); + return &entry->base; } static void ecore_future_recall(Eina_Future_Schedule_Entry *s_entry) { - Eo *msg; + Ecore_Future_Schedule_Entry *entry = (Ecore_Future_Schedule_Entry *)s_entry; + Efl_Loop_Future_Scheduler *loopsched; + Eina_List *lookup; if (shutting_down) return; - Ecore_Future_Schedule_Entry *entry = (Ecore_Future_Schedule_Entry *)s_entry; - EINA_SAFETY_ON_NULL_RETURN(entry->event); -// XXX: -// ecore_event_del(entry->event); - msg = entry->event; + + loopsched = (Efl_Loop_Future_Scheduler *) entry->base.scheduler; + + lookup = eina_list_data_find_list(loopsched->future_entries, entry); + if (!lookup) return; + + loopsched->future_entries = eina_list_remove_list(loopsched->future_entries, lookup); + if (!loopsched->future_entries) + efl_event_callback_array_del((Eo *) loopsched->loop, ecore_future_callbacks(), loopsched); + eina_value_flush(&entry->value); - entry->event = NULL; - efl_del(msg); + eina_mempool_free(mp_future_schedule_entry, entry); + } static Eina_Future_Scheduler ecore_future_scheduler = { diff --git a/src/lib/ecore/ecore_private.h b/src/lib/ecore/ecore_private.h index 2022526182..9bd3c3eb0e 100644 --- a/src/lib/ecore/ecore_private.h +++ b/src/lib/ecore/ecore_private.h @@ -109,6 +109,8 @@ struct _Efl_Loop_Future_Scheduler Eina_Future_Scheduler eina_future_scheduler; const Eo *loop; Efl_Loop_Data *loop_data; + + Eina_List *future_entries; }; struct _Efl_Loop_Data --