On Tue, Aug 16, 2016 at 10:52 AM, Gustavo Sverzut Barbieri
<barbi...@gmail.com> wrote:
> On Tue, Aug 16, 2016 at 4:52 AM, Jean-Philippe André <j...@videolan.org> 
> wrote:
>> Hi,

[snip]

>> But I'm not 100% sure about the usage of Eina_Error as a return value. When
>> we return a value, do we also call eina_error_set()?
>
> I was expecting to NOT eina_error_set(), since it's explicitly
> returned. But could set if you wish, do you?

I'd rather not do that, otherwise another call could be seen as being
error'ed out
which hasn't, later on. Or the user would have to manually eina_error_set(0)
after, which means a TLS access (which is expensive as hell).

>> In any case, Eina_Error at the moment can be used for exceptional cases and
>> APIs that don't or can't return precise error information (eg. return
>> NULL... but what failed?). Eg. a new patch I just pushed (set error to
>> timeout in timedwait).
>
> Eina_Error as in eina_error_set(), yes... it fixes the null-return in
> a "standard" way (given errno.h).
>
> Other options are:
>  - never return pointers, just errors... kinda of PITA
>  - encode errors on pointers... did that before, kinda of PITA as well

IMO, most return NULL on error do not set eina_error because
nobody cared about Eina_Error. Most of these return NULL are
usually because of invalid arguments, and these are usually
checked through EINA macros which could just be changed to
do eina_error_set for a EINA_ERROR_INVALID_ARGUMENT
error.

The problem between "return Eina_Error" vs "eina_error_set" is much
like C++'s problem of "return std::error_code" vs "throw exception". And
this is a problem very far from solved. The thing is: eina_error_set and
throwing exceptions are _very_expensive_, and can be dealt with in
a out-of-line error handling (not so much for eina_error_set, but at
least it doesn't require changes to function signatures). So, usually
the question when to use one or the other would be: Is the error
"common" or "an exceptional case"?

For IO, I'd say errors are more common than exceptional (connection
errors, etc). However, that doesn't say much, because being rare
or not can only be defined by who uses it, and not by who defines
the function. That's why in C++ I'm going to add overloads for
std::error_code which will return a error_code, and the normal
overload will just throw an exception if an error has occurred, so
the user has complete freeedom to evaluate if errors are exceptional
or not.

With eina_error_set, OTOH, since we don't have backtracking anyway
in C, the user is almost required to eina_error_get all the time to
check errors or detect returned NULL pointers. If he does'nt
care what the nature of the error is, then he can just return and leave
the eina_error_set as is for higher-level code to deal with the error
correctly.

However, where no NULL pointers are involved, a eina_error_get
would be required, which is expensive. Which would mean more
verbose code and less-efficient code for no benefit.

I'd say, if a function can fail, it either has some other way to check
for errors (like returning NULL pointers) or it should return an
Eina_Error. And all failures should eina_error_set if no Eina_Error
is returned, if it is returned then no eina_error_set should happen.

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

Regards,
-- 
Felipe Magno de Almeida

------------------------------------------------------------------------------
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to