Alexander Viro wrote:
> 
> On Sun, 8 Oct 2000, Daniel Phillips wrote:
> 
> > Linus Torvalds wrote:
> > > This, btw, is why Linux returns error numbers as -Exxx instead of using
> > > "-1" and "errno" - I dislike the latter enormously.
> >
> > It's not just a matter of disliking it, it's also not reentrant.
> 
> ??? Yes it is, if pointer goes to an auto variable in caller. I also do
> not like it, but reentrancy is _not_ the reason.

  1 /*
  2  *  linux/lib/errno.c
  3  *
  4  *  Copyright (C) 1991, 1992  Linus Torvalds
  5  */
  6 
  7 int errno;
  8 

Doesn't look very automatic to me.

> > It would be nice if we could return a struct consisting of the error and
> > result.  I'm not sure if this is allowed in C now or not.  It  didn't
> > work when I tried it with gcc: it seems to consider a struct-valued
> > function to be a void-valued.  Odd.
> 
> Eww... _Please_, let's not mess with structures in arguments/return
> values/assignments. For one thing, it's bloody inefficient on many
> platforms. For another, I don't like the idea of kernel becoming a
> crash-dummy for gcc folks.

It doesn't have to be inefficient - on x86 for example it's common to
return double results in ax:dx.  Then a two-int struct can be passed
back just like a double.  

If it was solid on all platforms I'd use it (it isn't - flunked my test
case, bad start).  Even if it wasn't particularly efficient, so long as
not grossly inefficient (passing back a linked list of bits would be too
slow).  Where correctness matter more than efficiency, which is most
places, why not?

The other problem is that C doesn't have any nice syntax for handling a
struct result. You have to do something like:

        struct result result = unreliable();
        if (result.errror) goto do_something;
        <do something with result.value>

which isn't a lot better than:
        
        int err;
        int value = unreliable(&err);
        if (err) goto do_something;
        <do something with value>

To be nice to use, it would have to look something like:

        with unreliable() if (!error) <do something with value>

which is essentially a lambda expression.  But that's another language.

Throwing and catching exceptions lets you get rid of a huge amount of
this ugly, error prone kind of code, but there is a well known problem:
C doesn't have exceptions.  So that's out.  I think the answer is, there
is no answer.  One day I'd like to take some time and hack in an
exception thrower/catcher as a demonstration.

> Functions returning structures are in a very dark area of C - let somebody
> else break their necks debugging the compilers.

That makes sense to me :-)

--
Daniel
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to