for eina_future, with my suggested implementation all the
promises/futures will be bound to their objects. If the object dies,
the futures are cancelled...

eolian should come to help and all methods returning futures should be
automatically bound to the object, unless they are explicitly marked
as unbound. Them these should not be calling back any of the previous
object.

On Mon, Dec 18, 2017 at 9:04 AM, Jean-Philippe ANDRÉ <j...@videolan.org> wrote:
> jpeg pushed a commit to branch master.
>
> http://git.enlightenment.org/core/efl.git/commit/?id=5dbfb7961f738245cceb144123cee207a1d65d55
>
> commit 5dbfb7961f738245cceb144123cee207a1d65d55
> Author: Jean-Philippe Andre <jp.an...@samsung.com>
> Date:   Fri Dec 15 17:44:28 2017 +0900
>
>     eo/eina: Add HACK to avoid calls to EO after shutdown
>
>     Efl.Future is an EO object which means even cancelling Efl.Future
>     objects requires EO. So this should be done before shutting down EO,
>     otherwise everything fails badly.
>
>     I believe Efl.Future is going to disappear soon, but the problem will
>     remain: if any promise/future uses EO or anything else outside of Eina
>     (so, basically anything) then it needs to be canceled before shutting
>     down the above layers. This is the same situation as with ecore events,
>     for which we've introduced ecore_event_type_flush.
>
>     Ping @cedric
> ---
>  src/lib/eina/eina_promise.c | 9 ++++++++-
>  src/lib/eina/eina_promise.h | 8 ++++++++
>  src/lib/eo/efl_future.c     | 1 +
>  3 files changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/src/lib/eina/eina_promise.c b/src/lib/eina/eina_promise.c
> index 649b6e97b0..7e7617ceb7 100644
> --- a/src/lib/eina/eina_promise.c
> +++ b/src/lib/eina/eina_promise.c
> @@ -532,10 +532,17 @@ eina_promise_init(void)
>     return EINA_FALSE;
>  }
>
> +EAPI void
> +__eina_promise_cancel_all(void)
> +{
> +   while (_pending_futures)
> +     _eina_future_cancel(_pending_futures->data, ECANCELED);
> +}
> +
>  Eina_Bool
>  eina_promise_shutdown(void)
>  {
> -   while (_pending_futures) _eina_future_cancel(_pending_futures->data, 
> ECANCELED);
> +   __eina_promise_cancel_all();
>     eina_mempool_del(_future_mp);
>     eina_mempool_del(_promise_mp);
>     eina_log_domain_unregister(_promise_log_dom);
> diff --git a/src/lib/eina/eina_promise.h b/src/lib/eina/eina_promise.h
> index 44e9aef655..41778c54a6 100644
> --- a/src/lib/eina/eina_promise.h
> +++ b/src/lib/eina/eina_promise.h
> @@ -1736,6 +1736,14 @@ eina_future_race_array(Eina_Future *array[])
>   */
>  #define eina_future_chain_easy(_prev, ...) 
> eina_future_chain_easy_array(_prev, (Eina_Future_Cb_Easy_Desc[]) 
> {__VA_ARGS__, {NULL, NULL, NULL, NULL, NULL}})
>
> +/**
> + * @brief Cancels all pending promise/futures.
> + *
> + * Internal function. Do not use.
> + *
> + * @internal
> + */
> +EAPI void __eina_promise_cancel_all(void);
>
>  /**
>   * @}
> diff --git a/src/lib/eo/efl_future.c b/src/lib/eo/efl_future.c
> index aaa1d88a51..8f19a34e11 100644
> --- a/src/lib/eo/efl_future.c
> +++ b/src/lib/eo/efl_future.c
> @@ -52,5 +52,6 @@ efl_future_init(void)
>  Eina_Bool
>  efl_future_shutdown(void)
>  {
> +   __eina_promise_cancel_all();
>     return EINA_TRUE;
>  }
>
> --
>
>



-- 
Gustavo Sverzut Barbieri
--------------------------------------
Mobile: +55 (16) 99354-9890

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to