Returning errno as a second value

Luís Oliveira luismbo at gmail.com
Wed Aug 7 17:44:35 UTC 2013


Felix Filozov <ffilozov at gmail.com> writes:

> In Allegro CL, the only safe way to get errno after a foreign function
> call is to configure the foreign function definition to return it as a
> second value.

Why does that happen. Is it because interrupt handlers may call
functions that overwrite errno?


> CFFI doesn't deal with errno. There has been some previous discussion
> (http://lists.common-lisp.net/pipermail/cffi-devel/2009-January/003017.
> html) to return errno safely, but doesn't seem like it went anywhere.

Re-reading that was useful. Thanks for the pointer.

To sum that discussion up: it'd nice to have cffi-sys:get-errno plus a
cffi-sys:without-3rd-party-messing-of-errno so we can implement errno
handling in the portable side of CFFI.

Do you think that cffi-sys:without-3rd-party-messing-of-errno macro is
feasible? If not, we'll have to place the abstraction at the
%FOREIGN-FUNCALL level as you suggest.


> So any library that tries to get errno is potentially broken in
> Allegro CL. I'm seeing this in practice with lisp-zmq, for example.

Out of curiosity, what's messing with errno in your case?


> I'd like to introduce a new option to defcfun and foreign-funcall
> called :errno.

> It would look like this: (foreign-funcall ("strlen" :errno t) :string
> "foo" :int), or (defcfun (strlen "strlen" :errno t) :int (s :string)).
>
> Calling (strlen) would return two values, the return value of the
> foreign call, and errno.
>
> In some Lisps, the only way to get errno is to make an additional
> foreign call. Then perhaps that call could be made by CFFI and returns
> as the second value.

That makes sense. Except for the second value bit because CFFI types can
yield more than one value. Alternatives that pop up:

  1. Return it as the first value. (Probably requires some
     multiple-value-list mangling which might not be acceptable
     performance-wise?)

  2. Have the foreign function accept an extra errno argument that takes
     some structure than can be modified with the errno value.

Not quite happy with either. Any other ideas?


> Since CFFI delegates the handling of errno to the implementation,
> perhaps we could preserve the status quo and not get bugged down in
> grandiose plans of portability.

CFFI /is/ a grandiose excursion into portability. :-)

Luís




More information about the cffi-devel mailing list