forked from enlightenment/efl
ecore: remove custom code for generating Eina_Future_Schedule attached on Efl.Loop.
This leverage the new infrastructure from Eo that provide a scheduler for any event attached to any object. Reviewed-by: Marcel Hollerbach <mail@marcel-hollerbach.de> Differential Revision: https://phab.enlightenment.org/D10481
This commit is contained in:
parent
474b1b2c2d
commit
aacb6bc0c8
|
@ -7,18 +7,6 @@
|
|||
#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 *
|
||||
|
@ -123,104 +111,6 @@ ecore_event_current_event_get(void)
|
|||
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)
|
||||
{
|
||||
|
@ -262,17 +152,6 @@ _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:
|
||||
|
|
|
@ -88,7 +88,6 @@ typedef struct _Ecore_Factorized_Idle Ecore_Factorized_Idle;
|
|||
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;
|
||||
|
@ -104,20 +103,10 @@ struct _Message
|
|||
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;
|
||||
|
@ -314,8 +303,6 @@ void *_ecore_factorized_idle_del(Ecore_Idler *idler);
|
|||
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);
|
||||
|
|
|
@ -663,6 +663,10 @@ _efl_loop_efl_task_end(Eo *obj, Efl_Loop_Data *pd EINA_UNUSED)
|
|||
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)
|
||||
{
|
||||
|
@ -675,14 +679,7 @@ 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));
|
||||
|
|
Loading…
Reference in New Issue