#include "Ecore.h"
#include "ecore_private.h"
-typedef struct _Ecore_Future_Schedule_Entry
-{
- Eina_Future_Schedule_Entry base;
- Eina_Future_Scheduler_Cb cb;
- Eina_Future *future;
- Eina_Value value;
-} Ecore_Future_Schedule_Entry;
-
-//////
-static Eina_Mempool *mp_future_schedule_entry = NULL;
-//////
-
static Ecore_Event_Message_Handler *_event_msg_handler = NULL;
EAPI Ecore_Event_Handler *
return ecore_event_message_handler_current_event_get(_event_msg_handler);
}
-static void _future_dispatch_cb(void *data, const Efl_Event *ev EINA_UNUSED);
-static void _event_del_cb(void *data, const Efl_Event *ev);
-
-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
-_future_dispatch_cb(void *data, const Efl_Event *ev EINA_UNUSED)
-{
- 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)
- {
- entry->cb(entry->future, entry->value);
- eina_mempool_free(mp_future_schedule_entry, entry);
- }
-}
-
-static void
-_event_del_cb(void *data, const Efl_Event *ev EINA_UNUSED)
-{
- 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);
- eina_mempool_free(mp_future_schedule_entry, entry);
- }
-}
-
-static Eina_Future_Schedule_Entry *
-ecore_future_schedule(Eina_Future_Scheduler *sched,
- Eina_Future_Scheduler_Cb cb,
- Eina_Future *future,
- Eina_Value value)
-{
- Efl_Loop_Future_Scheduler *loopsched = (Efl_Loop_Future_Scheduler *)sched;
- Ecore_Future_Schedule_Entry *entry;
-
- entry = eina_mempool_malloc(mp_future_schedule_entry, sizeof(*entry));
- EINA_SAFETY_ON_NULL_RETURN_VAL(entry, NULL);
- entry->base.scheduler = sched;
- entry->cb = cb;
- entry->future = future;
- entry->value = value;
-
- 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)
-{
- Ecore_Future_Schedule_Entry *entry = (Ecore_Future_Schedule_Entry *)s_entry;
- Efl_Loop_Future_Scheduler *loopsched;
- Eina_List *lookup;
-
- 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);
- eina_mempool_free(mp_future_schedule_entry, entry);
-
-}
-
-static Eina_Future_Scheduler ecore_future_scheduler = {
- .schedule = ecore_future_schedule,
- .recall = ecore_future_recall,
-};
-
-Eina_Future_Scheduler *
-_ecore_event_future_scheduler_get(void)
-{
- return &ecore_future_scheduler;
-}
-
Eina_Bool
_ecore_event_init(void)
{
// ECORE_EVENT_COUNT 11
// no need to do as it was a count, nto an event
- //FIXME: Is 512 too high?
- if (!mp_future_schedule_entry)
- {
- mp_future_schedule_entry = eina_mempool_add
- (choice, "Ecore_Future_Event", NULL,
- sizeof(Ecore_Future_Schedule_Entry), 512);
- EINA_SAFETY_ON_NULL_GOTO(mp_future_schedule_entry, err_pool);
- }
- //
- //////
-
return EINA_TRUE;
err_pool:
typedef struct _Efl_Loop_Promise_Simple_Data Efl_Loop_Promise_Simple_Data;
typedef struct _Efl_Loop_Timer_Data Efl_Loop_Timer_Data;
-typedef struct _Efl_Loop_Future_Scheduler Efl_Loop_Future_Scheduler;
typedef struct _Efl_Loop_Data Efl_Loop_Data;
typedef struct _Efl_Task_Data Efl_Task_Data;
Eina_Bool delete_me;
};
-struct _Efl_Loop_Future_Scheduler
-{
- Eina_Future_Scheduler eina_future_scheduler;
- const Eo *loop;
-
- Eina_List *future_entries;
-};
-
struct _Efl_Loop_Data
{
double loop_time;
- Efl_Loop_Future_Scheduler future_scheduler;
-
Efl_Loop_Message_Handler *future_message_handler;
Efl_Loop_Timer *poll_high;
void _ecore_factorized_idle_process(void *data, const Efl_Event *event);
void _ecore_factorized_idle_event_del(void *data, const Efl_Event *event);
-Eina_Future_Scheduler *_ecore_event_future_scheduler_get(void);
-
Eina_Bool _ecore_event_init(void);
void _ecore_event_shutdown(void);
int _ecore_event_exist(void);
efl_loop_quit(obj, eina_value_int_init(0));
}
+EFL_SCHEDULER_ARRAY_DEFINE(loop_scheduler,
+ EFL_LOOP_EVENT_IDLE_ENTER,
+ EFL_LOOP_EVENT_IDLE);
+
EAPI Eina_Future_Scheduler *
efl_loop_future_scheduler_get(const Eo *obj)
{
Efl_Loop_Data *pd = efl_data_scope_get(obj, EFL_LOOP_CLASS);
if (!pd) return NULL;
- if (!pd->future_scheduler.loop)
- {
- Eina_Future_Scheduler *sched =
- _ecore_event_future_scheduler_get();
- pd->future_scheduler.eina_future_scheduler = *sched;
- pd->future_scheduler.loop = obj;
- }
- return &(pd->future_scheduler.eina_future_scheduler);
+ return efl_event_future_scheduler_get(obj, loop_scheduler());
}
if (efl_isa(obj, EFL_LOOP_CONSUMER_CLASS))
return efl_loop_future_scheduler_get(efl_loop_get(obj));