-------- Original Message --------
 On February 27, 2018 2:52 PM, Carsten Haitzler <[email protected]> wrote:

>so I'm implementing a new efl.exe class (and efl.task and some others) and i
> WAS going to use a future as the return for run() ... but after just writing
> about 20 lines of code (get a scheduler, create a promise alloc promise data
> and all the checking in between) and i then realized... it's ballooning to an
> insane amount of code vs event_callback_call which is a 1 line func call when
> the event happens.
>
> let me just copy and paste the relevant lines i had sketched out (was not
> final or even compiling yet):
>
> typedef struct _Efl_Exe_Run_Data
> {
> Eo *obj;
> } Efl_Exe_Run_Data;
>
> static void
> _efl_exe_run_cancel(void *data, const Eina_Promise *dead_ptr EINA_UNUSED)
> {
> Efl_Exe_Run_Data *d = data;
>
> efl_task_end(d->obj);
>}
>
> Efl_Exe_Run_Data *d;
> Eina_Promise *p;
>
> d = calloc(1, sizeof(Efl_Exe_Run_Data));
> EINA_SAFETY_ON_NULL_RETURN_VAL(d, NULL);
> d->obj = obj;
>p = eina_promise_new(sched, _efl_exe_run_cancel, d);
> EINA_SAFETY_ON_NULL_RETURN_VAL(p, NULL);
> d->promise = p;
>d->run_future = efl_future_Eina_FutureXXX_then(obj, eina_future_new(p));
>return d->run_future;

You do not need to keep the future at all in your structure. You are good to go 
with just :

return efl_future_Eina_FutureXXX_then(obj, eina_future_new(p));

And once we have migrate future<> in .eo to Eina_Future, it will become just :

return eina_future_new(p);

> // XXX: no eina value for eo obj handles... :( call where exe exit handled
> Eina_Value *val = eina_value_new(EINA_VALUE_TYPE_UINT64);
> eina_promise_resolve(d->run_future, val);

This line can be properly written as :
eina_promise_resolve(d->promise, eina_value_uint_init(ret));

> i got to 22 lines and i wasn't even done yet (need to do some more
> housekeeping)... vs 1 line for event_callback_call. i'm going with events 
> until
> futures/promises are not a crazy amount of code compared to events. this is it
> with events:
>
> efl_event_callback_call(obj, EFL_TASK_EVENT_EXIT, NULL);

This is absolutely not doing what the future code is doing. You are not 
detecting when a user has removed the handler and so call efl_task_end 
accordingly. You are also not sending a structure with the exit code either 
(and of course you are not describing it in the .eo file). I don't even see how 
you can compare this two lines ? And we are not even looking at the user of the 
API here which is what matter even more. How do you make sure that the event is 
always delivered properly ? How often do you generate the event (Every time 
someone register a callback) ? There is a lot of open question with this kind 
of API that you are just disregarding here.

Cedric

------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to