Sorry for top-posting. But let me summarize the Promise lifetime:

A Promise when created starts with a ref-count of 1.
If the promise is not needed anymore, it should be
unref'ed (if no eina_promise_then is made, either
directly or by eina_promise_all/eina_promise_race).

The first eina_promise_then _steals_ the first
reference, the others eina_promise_then
increments the reference count.

When the promise is fulfilled (by value_set or error_set),
then each call to a eina_promise_then decrements
the reference count by 1.

When the reference count reaches 0 _and_ the
promise is fulfilled the promise is deleted (both
conditions must be true, if just one is true it
continues to exist).

So, valid cases:

Eina_Promise* p = ..;
eina_promise_then(p, ...);
// promise will be deleted
// when callback for the then is called

Eina_Promise* p = ...;
eina_promise_unref(p);
// Promise will be freed when promise is fulfilled
// by error_set or value_set

Eina_Promise* p = ...;
eina_promise_then(p, ...);
eina_promise_then(p, ...);
// promise will be deleted
// when callback for the then is called

Eina_Promise* p = ...;
eina_promise_all(p, ...);
eina_promise_then(p, ...);
// promise will be deleted
// when callback for the then is called

Eina_Promise* p = ...;
eina_promise_all(p, ...);
// promise will be deleted
// when callback for the then is called

Etc..

Regards,
--
Felipe Magno de Almeida


On Mon, Jun 13, 2016 at 2:17 PM, Cedric BAIL <cedric.b...@free.fr> wrote:
> Hello,
>
> On Sun, Jun 12, 2016 at 10:13 PM, Jean-Philippe André <j...@videolan.org> 
> wrote:
>> On 13 June 2016 at 03:02, Cedric BAIL <cedric.b...@free.fr> wrote:
>>> On Wed, Jun 8, 2016 at 4:16 AM, Carsten Haitzler <ras...@rasterman.com>
>>> wrote:
>>> > On Mon, 6 Jun 2016 06:01:13 +0200 Cedric BAIL <cedric.b...@free.fr>
>>> said:
>>> > and you can do the same with eo - you can store the result until cb's
>>> added or
>>> > until a go/done/whatever api is called. but that on;y matters if you
>>> want a
>>> > specific cb for that specific action. in general if you want that hen
>>> you want
>>> > a real object to be returned so you can manage it like other objects.
>>>
>>> As said before, basically what you want is an Eo object which doesn't
>>> behave like a normal eo object. Having its own meaning for ref/unref,
>>> for events and life cycle. At this point, I don't see how it will be
>>> easier for people and not more confusing ?
>>
>> Efl.Part are EO objects that die after a single function call.
>> So, we already have objects with a different lifecycle.
>
> Yes, but you are not supposed to interact with that said object more
> than with just one function. What happen if someone do an
> eo_ref/eo_unref on it ?
>
>> Events are the same: they call a callback function with a user data and an
>> event info (promise value).
>
> No. Event in promise will keep their value until all the reference to
> the promise exist and each time that a callback is triggered that
> reference count goes down by one. There is also an absolute guaranty
> that you can not destroy a promise without having all the reference
> receiving either a succeed or a fail. Also the returned value of an
> event handler for then or cancel should be ignored as you can not stop
> notifying anyone in the chain and the state should stay either success
> or failure once it has been decided.
>
>> For how long is a promise handle valid?
>> Is it valid up until eina_promise_then? What if you just stuff the promise
>> in a _race or _all?
>
> A promise is expecting one couple of cancel/then to be registered.
> Once it is, that promise can still be cancelled by the user if it has
> not triggered any of the callback it registered for, any other use
> will be illegal. If it give it to a _race or _all, he obviously loose
> his chance to register callbacks, so if he want to register them, he
> need to increase the ref count.
>
>> Can you ignore a promise handle altogether? (I guess it would leak)
>
> Will leak inded and make no sense as it is delivering something at the
> end of the pipe. If you do not want it, well, why did you ask for it ?
> :-)
>
>> Anyway it seems the only difference here is that a promise starts the
>> action as soon as possible, while an eo object would have to explicitely be
>> marked as ready (which is very similar to starting the action during
>> eina_promise_then).
>
> No, the main difference is that the life cycle is linked to the
> callbacks and that their should not be any way to bypass it. eo_del
> should also be forbidden for example on a promise as only a cancel
> make sense. Of course we could alias it, and make sure that cancel
> don't destroy the parent. We can also override all eo event API and
> make sure they do what we want, but we can't at the moment override
> eo_ref and eo_unref. The alternative would be to create an Eo_Promise
> which doesn't inherit from Eo_Base (Or make an Eo_Light that both
> would inherit from) and would kind of make clear that it is not an Eo
> object, but a promise object (Given that eo_ref and eo_unref become
> virtual function).
>
> Also at which point do you think user are going to be confused by an
> Eo object where every single function call on it has its own
> documentation and doesn't behave like a normal eo object ?
> --
> Cedric BAIL
>
> ------------------------------------------------------------------------------
> What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic
> patterns at an interface-level. Reveals which users, apps, and protocols are
> consuming the most bandwidth. Provides multi-vendor support for NetFlow,
> J-Flow, sFlow and other flows. Make informed decisions using capacity
> planning reports. https://ad.doubleclick.net/ddm/clk/305295220;132659582;e
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel



-- 
Felipe Magno de Almeida

------------------------------------------------------------------------------
What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic
patterns at an interface-level. Reveals which users, apps, and protocols are 
consuming the most bandwidth. Provides multi-vendor support for NetFlow, 
J-Flow, sFlow and other flows. Make informed decisions using capacity 
planning reports. https://ad.doubleclick.net/ddm/clk/305295220;132659582;e
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to