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.]]

-- 


Reply via email to