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:
Cedric Bail 2019-10-16 16:47:47 -07:00 committed by Marcel Hollerbach
parent 474b1b2c2d
commit aacb6bc0c8
3 changed files with 5 additions and 142 deletions

View File

@ -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:

View File

@ -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);

View File

@ -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));