Returning errno as a second value

Felix Filozov ffilozov at gmail.com
Sat Aug 10 15:29:31 UTC 2013


I worked out a basic implementation for a thread-local
errno<https://github.com/ffilozov/cffi/compare/thread-local-errno>.
Bordeaux-threads has been added as a dependency as well as two extra
functions: cffi:set-errno and cffi:get-errno.

This is a much cleaner interface than passing an object, and the generated
function doesn't need to have an extra parameter.

Sample:

CL-USER>  (cffi:defcfun ("socket" :errno t) :int
                 (a :int)
                 (b :int)
                 (c :int))
Warning: :call-direct ignored because :error-value specified.
SOCKET

CL-USER> (socket -1 -1 -1)
-1

CL-USER> (cffi:get-errno)
22
T

The implementation uses locking, so its efficiency could improved. I'm
interested in your suggestions on how to do that.



On Thu, Aug 8, 2013 at 4:29 AM, Daniel Herring <dherring at tentpost.com>wrote:

> Hi Felix,
>
> Errno is a particularly tricky beast.  It is a thread-local "global" that
> is modified by a large number of system calls and library functions. Code
> must be careful to check it before another such call is made.  I could
> easily imagine a stop-the-world GC accidentally modifying errno if errno is
> not checked "atomically" with the function call.
>
> Also errno is very lightweight.  An extra foreign call to check it could
> easily dwarf the cost of the check.  Errno is a "hidden" return parameter,
> much like the second position in a multiple-value return.
>
> Thus the Allegro semantics of returning errno as a second value seem
> reasonable to me.
>
> As you suggested, CFFI could provide a default errno implementation for
> CLs that have different native semantics.
>
> - Daniel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cffi-devel/attachments/20130810/a4950ddf/attachment.html>


More information about the cffi-devel mailing list