cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=e33d0d99963f16038d33f8d95cf5427e2ed29390

commit e33d0d99963f16038d33f8d95cf5427e2ed29390
Author: Cedric BAIL <[email protected]>
Date:   Mon Sep 11 16:10:46 2017 -0700

    eio: first convertion to new future/promise.
---
 src/lib/eio/efl_io_manager.c           | 51 +++++++++++++++++++++++++++-------
 src/lib/eio/efl_io_manager.eo          |  2 +-
 src/tests/eio/eio_test_manager_xattr.c | 43 ++++++++++++++++++++++++----
 3 files changed, 80 insertions(+), 16 deletions(-)

diff --git a/src/lib/eio/efl_io_manager.c b/src/lib/eio/efl_io_manager.c
index 51043f88c8..dc7b243ecf 100644
--- a/src/lib/eio/efl_io_manager.c
+++ b/src/lib/eio/efl_io_manager.c
@@ -434,7 +434,37 @@ _efl_io_manager_xattr_ls(Eo *obj,
    return NULL;
 }
 
-static Efl_Future *
+static void
+_future_file_done_cb(void *data, Eio_File *handler)
+{
+   Eina_Promise *p = data;
+   Eina_Value v = EINA_VALUE_EMPTY;
+
+   eina_value_setup(&v, EINA_VALUE_TYPE_UINT64);
+   eina_value_set(&v, handler->length);
+   eina_promise_resolve(p, v);
+}
+
+static void
+_future_file_error_cb(void *data,
+                      Eio_File *handler EINA_UNUSED,
+                      int error)
+{
+   Eina_Promise *p = data;
+   Eina_Value v = EINA_VALUE_EMPTY;
+
+   eina_value_setup(&v, EINA_VALUE_TYPE_ERROR);
+   eina_value_set(&v, error);
+   eina_promise_resolve(p, v);
+}
+
+static void
+_efl_io_manager_future_cancel(void *data, const Eina_Promise *dead_ptr 
EINA_UNUSED)
+{
+   eio_file_cancel(data);
+}
+
+static Eina_Future *
 _efl_io_manager_xattr_set(Eo *obj,
                           Efl_Io_Manager_Data *pd EINA_UNUSED,
                           const char *path,
@@ -442,28 +472,29 @@ _efl_io_manager_xattr_set(Eo *obj,
                           Eina_Binbuf *data,
                           Eina_Xattr_Flags flags)
 {
-   Efl_Promise *p;
+   Eina_Promise *p;
+   Eina_Future *future;
    Eio_File *h;
 
-   Eo *loop = efl_loop_get(obj);
-   p = efl_add(EFL_PROMISE_CLASS, loop);
+   p = eina_promise_new(efl_loop_future_scheduler_get(obj),
+                        _efl_io_manager_future_cancel, NULL);
    if (!p) return NULL;
+   future = eina_future_new(p);
 
    h = eio_file_xattr_set(path, attribute,
                           (const char *) eina_binbuf_string_get(data),
                           eina_binbuf_length_get(data),
                           flags,
-                          _file_done_cb,
-                          _file_error_cb,
+                          _future_file_done_cb,
+                          _future_file_error_cb,
                           p);
    if (!h) goto end;
+   eina_promise_data_set(p, h);
 
-   efl_event_callback_array_add(p, promise_handling(), h);
-   return efl_promise_future_get(p);
+   return efl_future_Eina_FutureXXX_then(obj, future);
 
  end:
-   efl_del(p);
-   return NULL;
+   return future;
 }
 
 static Efl_Future *
diff --git a/src/lib/eio/efl_io_manager.eo b/src/lib/eio/efl_io_manager.eo
index 4e7961aacb..34e70d985c 100644
--- a/src/lib/eio/efl_io_manager.eo
+++ b/src/lib/eio/efl_io_manager.eo
@@ -63,7 +63,7 @@ class Efl.Io.Manager (Efl.Loop_User)
             data: ptr(Eina.Binbuf); [[Data to set as information]]
             flags: Eina.Xattr.Flags; [[Extended attributes flags]]
          }
-         return: future<uint64>; [[Future for asynchronous set operation]]
+         return: own(ptr(Eina.Future)); [[Future for asynchronous set 
operation]]
       }
       get {
          return: future<Eina.Binbuf>; [[Information]]
diff --git a/src/tests/eio/eio_test_manager_xattr.c 
b/src/tests/eio/eio_test_manager_xattr.c
index b858de6534..3d41316f20 100644
--- a/src/tests/eio/eio_test_manager_xattr.c
+++ b/src/tests/eio/eio_test_manager_xattr.c
@@ -117,6 +117,39 @@ _error_cb(void *data EINA_UNUSED, const Efl_Event *ev)
    ecore_main_loop_quit();
 }
 
+static Eina_Value
+_future_all_cb(const void *data,
+               const Eina_Value array,
+               const Eina_Future *dead EINA_UNUSED)
+{
+   Eina_Error err;
+   unsigned int i, len;
+   int *num_of_attr = (int *)data;
+
+   if (array.type == EINA_VALUE_TYPE_ERROR)
+     {
+        eina_value_get(&array, &err);
+        fprintf(stderr, "Something has gone wrong: %s\n", 
eina_error_msg_get(err));
+        abort();
+     }
+   len = eina_value_array_count(&array);
+   for (i = 0; i < len; i++)
+     {
+        Eina_Value v;
+
+        eina_value_array_get(&array, i, &v);
+        if (v.type == EINA_VALUE_TYPE_ERROR)
+          {
+             eina_value_get(&v, &err);
+             fprintf(stderr, "Something has gone wrong: %s\n", 
eina_error_msg_get(err));
+             abort();
+          }
+     }
+
+   fail_if(*num_of_attr != len);
+   return array;
+}
+
 START_TEST(eio_test_job_xattr_set)
 {
    char *filename = "eio-tmpfile";
@@ -125,7 +158,7 @@ START_TEST(eio_test_job_xattr_set)
    unsigned int i;
    Eo *job;
    Efl_Future *ls = NULL;
-   Efl_Future **futures = NULL;
+   Eina_Future **futures = NULL;
 
    ecore_init();
    eina_init();
@@ -139,8 +172,8 @@ START_TEST(eio_test_job_xattr_set)
              S_IRWXU | S_IRWXG | S_IRWXO);
    fail_if(fd == 0);
 
-   futures = calloc(total_attributes + 1, sizeof(Efl_Future*));
-   futures[total_attributes] = NULL;
+   futures = calloc(total_attributes + 1, sizeof(Eina_Future*));
+   futures[total_attributes] = EINA_FUTURE_SENTINEL;
 
    for (i = 0; i < sizeof(attribute) / sizeof(attribute[0]); ++i)
      {
@@ -152,8 +185,8 @@ START_TEST(eio_test_job_xattr_set)
 
         fail_if(num_of_attr != 0); // test asynchronous
      }
-   efl_future_then(efl_future_iterator_all(eina_carray_iterator_new((void**) 
futures)),
-                   _done_set_cb, _error_cb, NULL, &num_of_attr);
+   eina_future_then(eina_future_all_array(futures),
+                    _future_all_cb, &num_of_attr);
 
    ecore_main_loop_begin();
 

-- 


Reply via email to