On Wed, 26 Dec 2018 03:33:42 -0800 Marcel Hollerbach <m...@marcel-hollerbach.de> said:
actually ... i fixed this without a revert - certain api's of eina promise were overlooked. i have the fix pending locally alongside some other fixes to gl linking... > bu5hm4n pushed a commit to branch master. > > http://git.enlightenment.org/core/efl.git/commit/?id=42e886d8d61d551bb544b777e6d254ce4dd3fcf1 > > commit 42e886d8d61d551bb544b777e6d254ce4dd3fcf1 > Author: Marcel Hollerbach <m...@marcel-hollerbach.de> > Date: Wed Dec 26 12:15:21 2018 +0100 > > Revert "ecore: make efl_loop_promise_new a function of Efl.Loop_Consumer." > > This reverts commit 9b5155c9f135f9ef450a817979f5884352b2d4c0. > > For now lets revert this, this breaks copy and paste, further more it > has the potential to break a lot more things, as eio_model tends to use > efl_loop_promise new, and then eina_promise_data_set, which is > explicitly forbidden. > > This fixes crashing terminology instances. > --- > src/lib/ecore/Ecore_Eo.h | 13 ++++++ > src/lib/ecore/efl_exe.c | 2 +- > src/lib/ecore/efl_loop.c | 7 ++++ > src/lib/ecore/efl_loop_consumer.c | 47 > ---------------------- src/lib/ecore/efl_loop_consumer.eo | > 17 -------- src/lib/ecore/efl_thread.c | 4 +- > .../efl_net_control_access_point-connman.c | 4 +- > .../ecore_con/efl_net_control_technology-connman.c | 6 +-- > src/lib/ecore_con/efl_net_ip_address.c | 2 +- > src/lib/eio/efl_io_manager.c | 18 ++++----- > src/lib/eio/eio_model.c | 4 +- > src/lib/eldbus/eldbus_model_connection.c | 2 +- > src/lib/eldbus/eldbus_model_object.c | 2 +- > src/lib/eldbus/eldbus_model_private.h | 1 - > src/lib/eldbus/eldbus_model_proxy.c | 3 +- > src/lib/elementary/efl_selection_manager.c | 4 +- > src/lib/eo/eina_types.eot | 2 - > 17 files changed, 45 insertions(+), 93 deletions(-) > > diff --git a/src/lib/ecore/Ecore_Eo.h b/src/lib/ecore/Ecore_Eo.h > index a070cd1b60..33e864f267 100644 > --- a/src/lib/ecore/Ecore_Eo.h > +++ b/src/lib/ecore/Ecore_Eo.h > @@ -62,6 +62,19 @@ EAPI int efl_loop_exit_code_process(Eina_Value *value); > */ > 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" > > diff --git a/src/lib/ecore/efl_exe.c b/src/lib/ecore/efl_exe.c > index e870fcaf1f..254dd4c17a 100644 > --- a/src/lib/ecore/efl_exe.c > +++ b/src/lib/ecore/efl_exe.c > @@ -485,7 +485,7 @@ _efl_exe_efl_task_run(Eo *obj EINA_UNUSED, Efl_Exe_Data > *pd) 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 > diff --git a/src/lib/ecore/efl_loop.c b/src/lib/ecore/efl_loop.c > index ab6d198316..1ef212f731 100644 > --- a/src/lib/ecore/efl_loop.c > +++ b/src/lib/ecore/efl_loop.c > @@ -902,4 +902,11 @@ efl_loop_future_scheduler_get(const Eo *obj) > #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" > diff --git a/src/lib/ecore/efl_loop_consumer.c > b/src/lib/ecore/efl_loop_consumer.c index f88c3e4473..29e94ed52d 100644 > --- a/src/lib/ecore/efl_loop_consumer.c > +++ b/src/lib/ecore/efl_loop_consumer.c > @@ -50,51 +50,4 @@ _efl_loop_consumer_future_rejected(Eo *obj, > Efl_Loop_Consumer_Data *pd EINA_UNUS 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" > diff --git a/src/lib/ecore/efl_loop_consumer.eo > b/src/lib/ecore/efl_loop_consumer.eo index ed9d351faa..4d7484e13c 100644 > --- a/src/lib/ecore/efl_loop_consumer.eo > +++ b/src/lib/ecore/efl_loop_consumer.eo > @@ -1,11 +1,3 @@ > -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 @@ -34,15 +26,6 @@ class Efl.Loop_Consumer (Efl.Object) > } > 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; } > diff --git a/src/lib/ecore/efl_thread.c b/src/lib/ecore/efl_thread.c > index c44e59b73a..f72aa07231 100644 > --- a/src/lib/ecore/efl_thread.c > +++ b/src/lib/ecore/efl_thread.c > @@ -412,7 +412,7 @@ _cb_thread_parent_ctrl_out(void *data, const Efl_Event > *event > EINA_UNUSED) > ////////////////////////////////////////////////////////////////////////// > 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); > @@ -777,7 +777,7 @@ _efl_thread_efl_task_run(Eo *obj, Efl_Thread_Data *pd) > } > 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)); > } > > diff --git a/src/lib/ecore_con/efl_net_control_access_point-connman.c > b/src/lib/ecore_con/efl_net_control_access_point-connman.c index > 32394ab989..a54cce2a50 100644 > --- a/src/lib/ecore_con/efl_net_control_access_point-connman.c > +++ b/src/lib/ecore_con/efl_net_control_access_point-connman.c > @@ -751,7 +751,7 @@ _efl_net_control_access_point_connect_cb(void *data, > const Eldbus_Message *msg, } > > 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; > @@ -773,7 +773,7 @@ _efl_net_control_access_point_connect(Eo *o, > Efl_Net_Control_Access_Point_Data * 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); > diff --git a/src/lib/ecore_con/efl_net_control_technology-connman.c > b/src/lib/ecore_con/efl_net_control_technology-connman.c index > a006923e61..92660de83f 100644 > --- a/src/lib/ecore_con/efl_net_control_technology-connman.c > +++ b/src/lib/ecore_con/efl_net_control_technology-connman.c > @@ -371,9 +371,9 @@ _efl_net_control_technology_scan_cb(void *data, const > Eldbus_Message *msg, Eldbu } > > 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; > > @@ -399,7 +399,7 @@ _efl_net_control_technology_scan(Eo *o, > Efl_Net_Control_Technology_Data *pd) 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); > diff --git a/src/lib/ecore_con/efl_net_ip_address.c > b/src/lib/ecore_con/efl_net_ip_address.c index 46fe75bd08..b6d9317dee 100644 > --- a/src/lib/ecore_con/efl_net_ip_address.c > +++ b/src/lib/ecore_con/efl_net_ip_address.c > @@ -573,7 +573,7 @@ _efl_net_ip_address_resolve(Eo *cls EINA_UNUSED, void *pd > EINA_UNUSED, const cha 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); > diff --git a/src/lib/eio/efl_io_manager.c b/src/lib/eio/efl_io_manager.c > index 9dcdfeeedf..6ac1746621 100644 > --- a/src/lib/eio/efl_io_manager.c > +++ b/src/lib/eio/efl_io_manager.c > @@ -119,7 +119,7 @@ _efl_io_manager_direct_ls(const Eo *obj, > 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); > > @@ -162,7 +162,7 @@ _efl_io_manager_stat_ls(const Eo *obj, > 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); > > @@ -204,7 +204,7 @@ _efl_io_manager_ls(const Eo *obj, > 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); > > @@ -256,7 +256,7 @@ _efl_io_manager_stat(const Eo *obj, > 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); > > @@ -285,7 +285,7 @@ _efl_io_manager_xattr_ls(const Eo *obj, > 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); > > @@ -336,7 +336,7 @@ _efl_io_manager_xattr_set(Eo *obj, > 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); > > @@ -366,7 +366,7 @@ _efl_io_manager_xattr_get(const Eo *obj, > 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); > > @@ -405,7 +405,7 @@ _efl_io_manager_open(const Eo *obj, > 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); > > @@ -431,7 +431,7 @@ _efl_io_manager_close(const Eo *obj, > 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); > > diff --git a/src/lib/eio/eio_model.c b/src/lib/eio/eio_model.c > index c6e03e663b..309af24a01 100644 > --- a/src/lib/eio/eio_model.c > +++ b/src/lib/eio/eio_model.c > @@ -417,7 +417,7 @@ _build_delay(Efl_Loop *loop) > { > 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) > { > @@ -682,7 +682,7 @@ _eio_model_efl_model_property_set(Eo *obj, > > 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, > diff --git a/src/lib/eldbus/eldbus_model_connection.c > b/src/lib/eldbus/eldbus_model_connection.c index a8f2d52478..175afcd924 100644 > --- a/src/lib/eldbus/eldbus_model_connection.c > +++ b/src/lib/eldbus/eldbus_model_connection.c > @@ -70,7 +70,7 @@ _eldbus_model_connection_efl_model_children_slice_get(Eo > *obj, 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; > diff --git a/src/lib/eldbus/eldbus_model_object.c > b/src/lib/eldbus/eldbus_model_object.c index b975514cbd..3759fc3f8f 100644 > --- a/src/lib/eldbus/eldbus_model_object.c > +++ b/src/lib/eldbus/eldbus_model_object.c > @@ -127,7 +127,7 @@ _eldbus_model_object_efl_model_children_slice_get(Eo *obj > EINA_UNUSED, 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; > diff --git a/src/lib/eldbus/eldbus_model_private.h > b/src/lib/eldbus/eldbus_model_private.h index e58a25d30d..3f6685921b 100644 > --- a/src/lib/eldbus/eldbus_model_private.h > +++ b/src/lib/eldbus/eldbus_model_private.h > @@ -41,7 +41,6 @@ extern int eldbus_model_log_dom; > > static inline void > _eldbus_eina_promise_cancel(void *data EINA_UNUSED, > - Efl_Loop_Consumer *consumer EINA_UNUSED, > const Eina_Promise *dead_ptr EINA_UNUSED) > { > } > diff --git a/src/lib/eldbus/eldbus_model_proxy.c > b/src/lib/eldbus/eldbus_model_proxy.c index ca5cfc3bf2..4da54ad7f4 100644 > --- a/src/lib/eldbus/eldbus_model_proxy.c > +++ b/src/lib/eldbus/eldbus_model_proxy.c > @@ -230,7 +230,6 @@ eldbus_model_proxy_property_check(Eldbus_Model_Proxy_Data > *pd, > 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; > @@ -294,7 +293,7 @@ _eldbus_model_proxy_efl_model_property_set(Eo *obj > EINA_UNUSED, 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; > > diff --git a/src/lib/elementary/efl_selection_manager.c > b/src/lib/elementary/efl_selection_manager.c index d0c4463a18..42d66a9918 > 100644 > --- a/src/lib/elementary/efl_selection_manager.c > +++ b/src/lib/elementary/efl_selection_manager.c > @@ -224,7 +224,7 @@ > _sel_manager_seat_selection_init(Efl_Selection_Manager_Data *pd, unsigned int > se } > 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( > @@ -247,7 +247,7 @@ _update_sel_lost_list(Efl_Object *obj, Efl_Selection_Type > type, 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; > diff --git a/src/lib/eo/eina_types.eot b/src/lib/eo/eina_types.eot > index d0b3dcbcb9..d08382c1cd 100644 > --- a/src/lib/eo/eina_types.eot > +++ b/src/lib/eo/eina_types.eot > @@ -99,8 +99,6 @@ struct @extern Eina.Stat { > 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]] > > > -- > > -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- Carsten Haitzler - ras...@rasterman.com _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel