From 54729224672db79ff2ec09307ac862ddf494f131 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Fri, 4 Jan 2019 16:01:13 -0800 Subject: [PATCH] ecore_con: remove use of eina_promise_data_set. eina_promise_data_set is a misleading API and result in conflicted use by multiple independent piece of code leading to bug and crash. It is also not necessary and we can avoid using it completely. Reviewed-by: Mike Blumenkrantz Differential Revision: https://phab.enlightenment.org/D7545 --- .../efl_net_control_technology-connman.c | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) 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 2ccec1d983..5b2af8c249 100644 --- a/src/lib/ecore_con/efl_net_control_technology-connman.c +++ b/src/lib/ecore_con/efl_net_control_technology-connman.c @@ -348,15 +348,11 @@ static void _efl_net_control_technology_scan_cb(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending) { Eina_Promise *promise = data; - Eo *o = eldbus_pending_data_get(eina_promise_data_get(promise), ".object"); - Efl_Net_Control_Technology_Data *pd = efl_data_scope_get(o, MY_CLASS); const char *err_name, *err_msg; - EINA_SAFETY_ON_NULL_RETURN(pd); - - pd->pending = eina_list_remove(pd->pending, pending); if (eldbus_message_error_get(msg, &err_name, &err_msg)) { + Eo *o = eldbus_pending_data_get(pending, ".object"); Eina_Error err = EINVAL; if (strcmp(err_name, "net.connman.Error.NotSupported") == 0) @@ -370,24 +366,29 @@ _efl_net_control_technology_scan_cb(void *data, const Eldbus_Message *msg, Eldbu eina_promise_resolve(promise, EINA_VALUE_EMPTY); } -static void -_efl_net_control_technology_scan_promise_del(void *data EINA_UNUSED, Efl_Loop_Consumer *consumer EINA_UNUSED, const Eina_Promise *dead_ptr) +static Eina_Value +_efl_net_control_technology_scan_promise_cancel(Eo *o EINA_UNUSED, void *data, Eina_Error error) { - Eldbus_Pending *p; + Eldbus_Pending *p = data; + + if (error == ECANCELED) + { + DBG("cancel pending scan %p", p); + eldbus_pending_cancel(p); + } + + return eina_value_error_init(error); +} + +static void +_efl_net_control_technology_scan_promise_del(Eo *o, void *data, const Eina_Future *dead_future EINA_UNUSED) +{ + Eldbus_Pending *p = data; Efl_Net_Control_Technology_Data *pd; - Eo *o; - p = eina_promise_data_get(dead_ptr); - if (!p) return; /* already gone, nothing to do */ - - o = eldbus_pending_data_get(p, ".object"); pd = efl_data_scope_get(o, MY_CLASS); - EINA_SAFETY_ON_NULL_RETURN(pd); - pd->pending = eina_list_remove(pd->pending, p); - DBG("cancel pending scan %p", p); - eldbus_pending_cancel(p); } EOLIAN static Eina_Future * @@ -397,7 +398,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, NULL, NULL, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(promise, NULL); f = eina_future_new(promise); @@ -407,10 +408,12 @@ _efl_net_control_technology_scan(Eo *o, Efl_Net_Control_Technology_Data *pd) EINA_SAFETY_ON_NULL_GOTO(p, error_dbus); pd->pending = eina_list_append(pd->pending, p); - eina_promise_data_set(promise, p); eldbus_pending_data_set(p, ".object", o); - return efl_future_then(o, f); + return efl_future_then(o, f, + .error = _efl_net_control_technology_scan_promise_cancel, + .free = _efl_net_control_technology_scan_promise_del, + .data = p); error_dbus: eina_promise_reject(promise, ENOSYS);