cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=7fa953e9ae4fa1adc384a1c2de740b45e9efb44f
commit 7fa953e9ae4fa1adc384a1c2de740b45e9efb44f Author: Cedric Bail <ced...@osg.samsung.com> Date: Tue Apr 26 12:56:53 2016 -0700 ecore: add Efl.Loop.Job promise. --- src/lib/ecore/ecore.c | 4 ++++ src/lib/ecore/ecore_main.c | 50 +++++++++++++++++++++++++++++++++++++++++++ src/lib/ecore/ecore_private.h | 2 ++ src/lib/ecore/efl_loop.eo | 7 ++++++ 4 files changed, 63 insertions(+) diff --git a/src/lib/ecore/ecore.c b/src/lib/ecore/ecore.c index 43bebbe..758cd02 100644 --- a/src/lib/ecore/ecore.c +++ b/src/lib/ecore/ecore.c @@ -67,6 +67,8 @@ static int _ecore_init_count_threshold = 0; int _ecore_log_dom = -1; int _ecore_fps_debug = 0; +Eina_Error _promise_canceled; + typedef struct _Ecore_Safe_Call Ecore_Safe_Call; struct _Ecore_Safe_Call { @@ -250,6 +252,8 @@ ecore_init(void) if (!ecore_mempool_init()) goto shutdown_mempool; _ecore_main_loop_init(); + _promise_canceled = eina_error_msg_static_register("Promise has been canceled."); + vpath = eo_add(EFL_VPATH_CORE_CLASS, NULL); if (vpath) efl_vpath_manager_register(EFL_VPATH_MANAGER_CLASS, 0, vpath); diff --git a/src/lib/ecore/ecore_main.c b/src/lib/ecore/ecore_main.c index 742a65e..0009f6ac 100644 --- a/src/lib/ecore/ecore_main.c +++ b/src/lib/ecore/ecore_main.c @@ -2803,4 +2803,54 @@ _efl_loop_eo_base_constructor(Eo *obj, Efl_Loop_Data *pd) return obj; } +typedef struct _Efl_Internal_Job Efl_Internal_Job; +struct _Efl_Internal_Job +{ + Ecore_Job *job; + Eina_Promise_Owner *promise; + + const void *data; +}; + +static void +_efl_loop_job_cb(void *data) +{ + Efl_Internal_Job *j = data; + + eina_promise_owner_value_set(j->promise, &j->data, NULL); + + free(j); +} + +static void +_efl_loop_job_cancel(void* data, Eina_Promise_Owner* promise EINA_UNUSED) +{ + Efl_Internal_Job *j = data; + + eina_promise_owner_error_set(j->promise, _promise_canceled); + ecore_job_del(j->job); + free(j); +} + +static void +_efl_loop_job(Eo *obj EINA_UNUSED, Efl_Loop_Data *pd EINA_UNUSED, Eina_Promise_Owner *promise, const void *data) +{ + Efl_Internal_Job *j; + + j = calloc(1, sizeof (Efl_Internal_Job)); + if (!j) goto on_error; + + eina_promise_owner_default_cancel_cb_add(promise, &_efl_loop_job_cancel, j, NULL); + j->promise = promise; + j->data = data; + j->job = ecore_job_add(_efl_loop_job_cb, j); + if (!j->job) goto on_error; + + return ; + + on_error: + eina_promise_owner_error_set(promise, _promise_canceled); + free(j); +} + #include "efl_loop.eo.c" diff --git a/src/lib/ecore/ecore_private.h b/src/lib/ecore/ecore_private.h index 76431d2..7b47e2b 100644 --- a/src/lib/ecore/ecore_private.h +++ b/src/lib/ecore/ecore_private.h @@ -373,6 +373,8 @@ GENERIC_ALLOC_FREE_HEADER(Ecore_Win32_Handler, ecore_win32_handler); #undef GENERIC_ALLOC_FREE_HEADER +extern Eina_Error _promise_canceled; + extern Eo *_mainloop_singleton; extern Eo *_ecore_parent; #define ECORE_PARENT_CLASS ecore_parent_class_get() diff --git a/src/lib/ecore/efl_loop.eo b/src/lib/ecore/efl_loop.eo index 22d26b8..38b4a04 100644 --- a/src/lib/ecore/efl_loop.eo +++ b/src/lib/ecore/efl_loop.eo @@ -31,6 +31,13 @@ class Efl.Loop (Eo.Base) [[Quits the main loop once all the events currently on the queue have been processed.]] } + job { + [[Will execute that promise in the near future.]] + params { + @inout promise: promise<void*>*; + @in data: const(void)* @optional; + } + } } events { idle,enter @restart; [[Event occurs once the main loop enters the idle state.]] --