*/
EAPI Eina_Future_Scheduler *efl_loop_future_scheduler_get(const Eo *obj);
+/**
+ * @brief Create a promise attached to the current loop
+ *
+ * @param[in] An object which will provide a loop, either by being a loop or a loop consumer
+ * @param cancel_cb A callback used to inform that the promise was canceled. Use
+ * this callback to @c free @p data. @p cancel_cb must not be @c NULL !
+ * @param data Data to @p cancel_cb.
+ * @return A promise or @c NULL on error.
+ *
+ * @see eina_promise_new()
+ */
+EAPI Eina_Promise *efl_loop_promise_new(const Eo *obj, Eina_Promise_Cancel_Cb cancel_cb, const void *data);
+
#include "efl_loop_fd.eo.h"
#include "efl_loop_handler.eo.h"
EFL_LOOP_HANDLER_FLAGS_READ));
_ecore_signal_pid_unlock();
pd->run = EINA_TRUE;
- pd->promise = efl_loop_promise_new(obj, obj, _run_cancel_cb, NULL);
+ pd->promise = efl_loop_promise_new(obj, _run_cancel_cb, obj);
return efl_future_then(obj, eina_future_new(pd->promise));
}
// this code is in the child here, and is temporary setup until we
#define EFL_LOOP_EXTRA_OPS \
EFL_OBJECT_OP_FUNC(efl_loop_message_process, _efl_loop_message_process)
+EAPI Eina_Promise *
+efl_loop_promise_new(const Eo *obj, Eina_Promise_Cancel_Cb cancel_cb, const void *data)
+{
+ return eina_promise_new(efl_loop_future_scheduler_get(obj),
+ cancel_cb, data);
+}
+
#include "efl_loop.eo.c"
return eina_future_rejected(efl_loop_future_scheduler_get(obj), error);
}
-typedef struct _Efl_Loop_Consumer_Promise Efl_Loop_Consumer_Promise;
-struct _Efl_Loop_Consumer_Promise
-{
- EflLoopConsumerPromiseCancel func;
- Eina_Free_Cb free;
- void *data;
- Eo *obj;
-};
-
-static void
-_cancel_free(void *data)
-{
- Efl_Loop_Consumer_Promise *lcp = data;
-
- if (lcp->free) lcp->free(lcp->data);
- efl_unref(lcp->obj);
- free(lcp);
-}
-
-static void
-_cancel_triggered(void *data, const Eina_Promise *p)
-{
- Efl_Loop_Consumer_Promise *lcp = data;
-
- if (lcp->func) lcp->func(lcp->data, lcp->obj, p);
-}
-
-static Eina_Promise *
-_efl_loop_consumer_promise_new(Eo *obj, Efl_Loop_Consumer_Data *pd,
- void *cancel_data, EflLoopConsumerPromiseCancel cancel, Eina_Free_Cb cancel_free_cb)
-{
- Efl_Loop_Consumer_Promise *lcp;
- Eina_Promise *p;
-
- lcp = calloc(1, sizeof (Efl_Loop_Consumer_Promise));
- if (!lcp) return NULL;
-
- lcp->func = cancel;
- lcp->data = cancel_data;
- lcp->free = cancel_free_cb;
- lcp->obj = efl_ref(obj);
-
- p = eina_promise_new(efl_loop_future_scheduler_get(obj), _cancel_triggered, lcp);
- eina_promise_data_free_cb_set(p, _cancel_free);
- return p;
-}
-
#include "efl_loop_consumer.eo.c"
-function EflLoopConsumerPromiseCancel {
- [[EflLoopConsumerPromiseCancel function callback called when a promise is cancelled.]]
- params {
- @in consumer: Efl.Loop_Consumer; [[The consumer that was used to create the promise.]]
- @in dead_promise: const(ptr(Eina.Promise)); [[The promise that was just cancelled.]]
- }
-};
-
class Efl.Loop_Consumer (Efl.Object)
{
[[An Efl.Loop_Consumer is a class which requires one of the parents to provide
}
return: future<Eina.Error>;
}
- promise_new {
- [[Create a new promise with the scheduler coming from the loop provided by this object.
-
- Note: You should not use eina_promise_data_set as this function rely on controlling the promise data.]]
- params {
- cancel: EflLoopConsumerPromiseCancel; [[Callback called when the promise is being cancelled.]]
- }
- return: ptr(Eina.Promise) @owned; [[The new promise.]]
- }
}
implements {
Efl.Object.parent { set; }
//////////////////////////////////////////////////////////////////////////
static void
-_run_cancel_cb(void *data, Efl_Loop_Consumer *consumer EINA_UNUSED, const Eina_Promise *dead_promise EINA_UNUSED)
+_run_cancel_cb(void *data, const Eina_Promise *dead_promise EINA_UNUSED)
{
Eo *obj = data;
Efl_Thread_Data *pd = efl_data_scope_get(obj, MY_CLASS);
}
pd->thdat = thdat;
pd->run = EINA_TRUE;
- pd->promise = efl_loop_promise_new(obj, obj, _run_cancel_cb, NULL);
+ pd->promise = efl_loop_promise_new(obj, _run_cancel_cb, obj);
return efl_future_then(obj, eina_future_new(pd->promise));
}
}
static void
-_efl_net_control_access_point_connect_promise_del(void *data, Efl_Loop_Consumer *consumer EINA_UNUSED, const Eina_Promise *dead_ptr)
+_efl_net_control_access_point_connect_promise_del(void *data, const Eina_Promise *dead_ptr)
{
Eldbus_Pending *p = data;
Efl_Net_Control_Access_Point_Data *pd;
Eina_Promise *promise;
Eina_Future *f = NULL;
- promise = efl_loop_promise_new(o, o, _efl_net_control_access_point_connect_promise_del, NULL);
+ promise = efl_loop_promise_new(o, _efl_net_control_access_point_connect_promise_del, o);
EINA_SAFETY_ON_NULL_RETURN_VAL(promise, NULL);
f = eina_future_new(promise);
}
static void
-_efl_net_control_technology_scan_promise_del(void *data, Efl_Loop_Consumer *consumer, const Eina_Promise *dead_ptr)
+_efl_net_control_technology_scan_promise_del(void *data, const Eina_Promise *dead_ptr)
{
- Eldbus_Pending *p = consumer;
+ Eldbus_Pending *p = data;
Efl_Net_Control_Technology_Data *pd;
Eo *o;
Eina_Promise *promise;
Eina_Future *f = NULL;
- promise = efl_loop_promise_new(o, NULL, _efl_net_control_technology_scan_promise_del, NULL);
+ promise = efl_loop_promise_new(o, _efl_net_control_technology_scan_promise_del, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(promise, NULL);
f = eina_future_new(promise);
ctx->thread = efl_net_ip_resolve_async_new(host, port, &hints, _efl_net_ip_address_resolve_done, ctx);
EINA_SAFETY_ON_NULL_GOTO(ctx->thread, error_thread);
- ctx->promise = eina_promise_new(efl_loop_future_scheduler_get(efl_main_loop_get()), _efl_net_ip_address_resolve_del, ctx);
+ ctx->promise = efl_loop_promise_new(efl_main_loop_get(), _efl_net_ip_address_resolve_del, ctx);
EINA_SAFETY_ON_NULL_GOTO(ctx->promise, error_promise);
free(str);
Eina_Future *future;
Eio_File *h;
- p = eina_promise_new(efl_loop_future_scheduler_get(obj), _efl_io_manager_future_cancel, NULL);
+ p = efl_loop_promise_new(obj, _efl_io_manager_future_cancel, NULL);
if (!p) return NULL;
future = eina_future_new(p);
Eina_Future *future;
Eio_File *h;
- p = eina_promise_new(efl_loop_future_scheduler_get(obj), _efl_io_manager_future_cancel, NULL);
+ p = efl_loop_promise_new(obj, _efl_io_manager_future_cancel, NULL);
if (!p) return NULL;
future = eina_future_new(p);
Eina_Future *future;
Eio_File *h;
- p = eina_promise_new(efl_loop_future_scheduler_get(obj), _efl_io_manager_future_cancel, NULL);
+ p = efl_loop_promise_new(obj, _efl_io_manager_future_cancel, NULL);
if (!p) return NULL;
future = eina_future_new(p);
Eina_Future *future;
Eio_File *h;
- p = eina_promise_new(efl_loop_future_scheduler_get(obj), _efl_io_manager_future_cancel, NULL);
+ p = efl_loop_promise_new(obj, _efl_io_manager_future_cancel, NULL);
if (!p) return NULL;
future = eina_future_new(p);
Eina_Future *future;
Eio_File *h;
- p = eina_promise_new(efl_loop_future_scheduler_get(obj), _efl_io_manager_future_cancel, NULL);
+ p = efl_loop_promise_new(obj, _efl_io_manager_future_cancel, NULL);
if (!p) return NULL;
future = eina_future_new(p);
Eina_Future *future;
Eio_File *h;
- p = eina_promise_new(efl_loop_future_scheduler_get(obj), _efl_io_manager_future_cancel, NULL);
+ p = efl_loop_promise_new(obj, _efl_io_manager_future_cancel, NULL);
if (!p) return NULL;
future = eina_future_new(p);
Eina_Future *future;
Eio_File *h;
- p = eina_promise_new(efl_loop_future_scheduler_get(obj), _efl_io_manager_future_cancel, NULL);
+ p = efl_loop_promise_new(obj, _efl_io_manager_future_cancel, NULL);
if (!p) return NULL;
future = eina_future_new(p);
Eina_Future *future;
Eio_File *h;
- p = eina_promise_new(efl_loop_future_scheduler_get(obj), _efl_io_manager_future_cancel, NULL);
+ p = efl_loop_promise_new(obj, _efl_io_manager_future_cancel, NULL);
if (!p) return NULL;
future = eina_future_new(p);
Eina_Future *future;
Eio_File *h;
- p = eina_promise_new(efl_loop_future_scheduler_get(obj), _efl_io_manager_future_cancel, NULL);
+ p = efl_loop_promise_new(obj, _efl_io_manager_future_cancel, NULL);
if (!p) return NULL;
future = eina_future_new(p);
{
Eina_Promise *p;
- p = eina_promise_new(efl_loop_future_scheduler_get(loop), _cancel_request, NULL);
+ p = efl_loop_promise_new(loop, _cancel_request, NULL);
if (!delayed_queue)
{
if (finalized)
{
- Eina_Promise *p = eina_promise_new(efl_loop_future_scheduler_get(obj), _efl_io_manager_future_cancel, NULL);
+ Eina_Promise *p = efl_loop_promise_new(obj, _efl_io_manager_future_cancel, NULL);
f = eina_future_new(p);
pd->request.move = eio_file_move(pd->path, path,
return efl_loop_future_resolved(obj, v);
}
- p = efl_loop_promise_new(obj, NULL, _eldbus_eina_promise_cancel, NULL);
+ p = efl_loop_promise_new(obj, _eldbus_eina_promise_cancel, NULL);
slice = calloc(1, sizeof (Eldbus_Children_Slice_Promise));
slice->p = p;
return efl_loop_future_resolved(obj, v);
}
- p = efl_loop_promise_new(obj, NULL, _eldbus_eina_promise_cancel, NULL);
+ p = efl_loop_promise_new(obj, _eldbus_eina_promise_cancel, NULL);
slice = calloc(1, sizeof(struct _Eldbus_Children_Slice_Promise));
slice->p = p;
static inline void
_eldbus_eina_promise_cancel(void *data EINA_UNUSED,
- Efl_Loop_Consumer *consumer EINA_UNUSED,
const Eina_Promise *dead_ptr EINA_UNUSED)
{
}
static void
_eldbus_model_proxy_cancel_cb(void *data,
- Efl_Loop_Consumer *consumer EINA_UNUSED,
const Eina_Promise *dead_promise EINA_UNUSED)
{
Eldbus_Model_Proxy_Property_Set_Data *sd = data;
if (!data) goto on_error;
data->pd = pd;
- data->promise = efl_loop_promise_new(obj, data, _eldbus_model_proxy_cancel_cb, NULL);
+ data->promise = efl_loop_promise_new(obj, _eldbus_model_proxy_cancel_cb, data);
data->property = eina_stringshare_add(property);
if (!(data->value = eina_value_dup(value))) goto on_error;
}
static void
-_sel_manager_promise_cancel(void *data, Efl_Loop_Consumer *consumer, const Eina_Promise *dead_future EINA_UNUSED)
+_sel_manager_promise_cancel(void *data, const Eina_Promise *dead_future EINA_UNUSED)
{
Sel_Manager_Selection_Lost *sel_lost = data;
sel_lost->seat_sel->sel_lost_list = eina_list_remove(
sel_lost->seat_sel = seat_sel;
seat_sel->sel_lost_list = eina_list_append(seat_sel->sel_lost_list, sel_lost);
- p = efl_loop_promise_new(obj, NULL, _sel_manager_promise_cancel, NULL);
+ p = efl_loop_promise_new(obj, _sel_manager_promise_cancel, NULL);
eina_promise_data_set(p, sel_lost);
if (!p) return NULL;
sel_lost->promise = p;
ctimensec: ulong; [[The nano version of the timestmap when the file was created]]
}
-struct @extern Eina.Promise; [[Eina promise type]]
-
/* FIXME: This definitely shouldn't be here. */
type Efl.Event_Cb: __undefined_type; [[Efl event callback type]]