cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=245ea06a6565d0261564652a26a9310420e48740
commit 245ea06a6565d0261564652a26a9310420e48740 Author: Cedric BAIL <ced...@osg.samsung.com> Date: Wed Sep 27 16:32:58 2017 -0700 eio: convert Efl.Io.Manager.stat() to return Eina_Future. --- src/lib/eio/efl_io_manager.c | 81 +++++++++++++++++++++++++++------------- src/lib/eio/efl_io_manager.eo | 2 +- src/tests/eio/eio_test_manager.c | 40 ++++++++++++++------ 3 files changed, 85 insertions(+), 38 deletions(-) diff --git a/src/lib/eio/efl_io_manager.c b/src/lib/eio/efl_io_manager.c index b19f7e3476..59af2d223b 100644 --- a/src/lib/eio/efl_io_manager.c +++ b/src/lib/eio/efl_io_manager.c @@ -51,6 +51,11 @@ struct _Job_Closure }; /* Helper functions */ +static void +_efl_io_manager_future_cancel(void *data, const Eina_Promise *dead_ptr EINA_UNUSED) +{ + eio_file_cancel(data); +} static void _no_future(void *data, const Efl_Event *ev EINA_UNUSED) @@ -343,50 +348,80 @@ _efl_io_manager_ls(Eo *obj, } /* Stat function */ +EINA_VALUE_STRUCT_DESC_DEFINE(_eina_stat_desc, + NULL, + sizeof (Eina_Stat), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, dev), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, ino), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_UINT, Eina_Stat, mode), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_UINT, Eina_Stat, nlink), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_UINT, Eina_Stat, uid), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_UINT, Eina_Stat, gid), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, rdev), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, size), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, blksize), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, blocks), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, atime), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, atimensec), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, mtime), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, mtimensec), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, ctime), + EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, ctimensec)); + static void _file_stat_done_cb(void *data, Eio_File *handle EINA_UNUSED, const Eina_Stat *stat) { - Efl_Promise *p = data; - Eina_Stat *c; + Eina_Value_Struct value = { _eina_stat_desc(), NULL }; + Eina_Promise *p = data; + Eina_Value r = EINA_VALUE_EMPTY; + Eina_Stat *cpy = NULL; - c = calloc(1, sizeof (Eina_Stat)); - if (!c) - { - efl_promise_failed_set(p, ENOMEM); - goto end; - } + cpy = calloc(1, sizeof (Eina_Stat)); + if (!cpy) goto on_error; - memcpy(c, stat, sizeof (Eina_Stat)); - efl_promise_value_set(p, c, free); + memcpy(cpy, stat, sizeof (Eina_Stat)); + value.memory = cpy; - end: - efl_del(p); + if (!eina_value_setup(&r, EINA_VALUE_TYPE_STRUCT)) + goto on_error; + if (!eina_value_pset(&r, &value)) + goto on_error; + + eina_promise_resolve(p, r); + + return ; + + on_error: + free(cpy); + eina_value_flush(&r); + eina_promise_reject(p, eina_error_get()); } -static Efl_Future * +static Eina_Future * _efl_io_manager_stat(Eo *obj, Efl_Io_Manager_Data *pd EINA_UNUSED, const char *path) { - 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_direct_stat(path, _file_stat_done_cb, _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; } /* eXtended attribute manipulation */ @@ -453,12 +488,6 @@ _future_file_error_cb(void *data, eina_promise_reject(p, error); } -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, diff --git a/src/lib/eio/efl_io_manager.eo b/src/lib/eio/efl_io_manager.eo index 9d8f46d589..8ad5443f01 100644 --- a/src/lib/eio/efl_io_manager.eo +++ b/src/lib/eio/efl_io_manager.eo @@ -52,7 +52,7 @@ class Efl.Io.Manager (Efl.Loop_User) params { @in path: string; [[Path we want to get stat information for]] } - return: future<Eina.Stat>; [[Stat information]] + return: ptr(Eina.Future); [[Stat information]] } // FIXME: Add helper for Eina.Value to Xattr diff --git a/src/tests/eio/eio_test_manager.c b/src/tests/eio/eio_test_manager.c index e97310276c..8224af207a 100644 --- a/src/tests/eio/eio_test_manager.c +++ b/src/tests/eio/eio_test_manager.c @@ -75,19 +75,37 @@ _open_done_cb(void *data, return file; } -static void -_stat_done_cb(void *data, const Efl_Event *ev) +static Eina_Value +_stat_done_cb(void *data, + const Eina_Value st, + const Eina_Future *dead EINA_UNUSED) { - Efl_Future_Event_Success *success = ev->info; - Eina_Stat const* stat = success->value; Eina_Bool *is_dir = data; unsigned int rights; - fail_if(eio_file_is_dir(stat) != *is_dir); - fail_if(eio_file_is_lnk(stat)); - rights = stat->mode & (S_IRWXU | S_IRWXG | S_IRWXO); - fail_if(rights != default_rights); + if (st.type == EINA_VALUE_TYPE_ERROR) + { + Eina_Error err; + eina_value_get(&st, &err); + fprintf(stderr, "Something has gone wrong: %s\n", eina_error_msg_get(err)); + abort(); + } + + if (st.type == EINA_VALUE_TYPE_STRUCT) + { + unsigned int mode = 0; + + fail_if(!eina_value_struct_get(&st, "mode", &mode)); + fail_if(S_ISDIR(mode) != *is_dir); + fail_if(S_ISLNK(mode)); + + rights = mode & (S_IRWXU | S_IRWXG | S_IRWXO); + fail_if(rights != default_rights); + } + ecore_main_loop_quit(); + + return st; } static void @@ -128,7 +146,7 @@ START_TEST(efl_io_manager_test_stat) Eina_Tmpstr *nested_dirname; Eina_Tmpstr *nested_filename; Efl_Io_Manager *job; - Efl_Future *f; + Eina_Future *f; Eina_Bool is_dir = EINA_TRUE; int ret; @@ -150,12 +168,12 @@ START_TEST(efl_io_manager_test_stat) // Start testing f = efl_io_manager_stat(job, nested_dirname); - efl_future_then(f, &_stat_done_cb, &_error_cb, NULL, &is_dir); + eina_future_then(f, _stat_done_cb, &is_dir); ecore_main_loop_begin(); is_dir = EINA_FALSE; f = efl_io_manager_stat(job, nested_filename); - efl_future_then(f, &_stat_done_cb, &_error_cb, NULL, &is_dir); + eina_future_then(f, _stat_done_cb, &is_dir); ecore_main_loop_begin(); // Cleanup --