[cffi-devel] Safe errno collection

John Fremlin jf at msi.co.jp
Fri Jan 9 05:17:39 UTC 2009


"Luís Oliveira" <luismbo at gmail.com> writes:

> On Fri, Jan 9, 2009 at 1:06 AM, John Fremlin <jf at msi.co.jp> wrote:
>> However, there is no guarantee that between calling your function and
>> getting the errno, the Lisp environment will not call a C function that
>> resets errno.
>
> I guess this is more of a problem in Lisps with userspace threads. Are
> there other situations? (Signal handlers shouldn't mess with errno...
> Maybe GC hooks?) Any idea how Allegro implements this?

I'm not sure. I asked them and Duane said that wrapping with
without-interrupts might be okay

(defmacro with-errno (&body body)
  `( ,(progn 
       'progn 
       #+allegro 'excl:without-interrupts)
      (locally , at body) (get-errno)))

I asked about whether this might not work in the event of GC and got no
answer.

>> In SBCL there is a native get-errno function to get the errno.
>>
>> Is there any plan to add a semi-portable wrapper to this functionality
>> for CFFI?
>
> Adding a CFFI-SYS:GET-ERRNO function sounds like a good idea. I don't
> understand the other bit well enough yet to have an opinion.

It'd be great to be able to use the def-foreign-call Allegro
functionality.

ClozureCL has something slightly similar called int-errno-call

(defmacro int-errno-call (form)
  (let* ((value (gensym)))
    `(let* ((,value ,form))
      (if (< ,value 0)
        (%get-errno)
        ,value))))

>> If not, would you accept a patch for it? I guess the obvious way is to
>> modify (cffi:defcfun ...) to take a :after-collect-value argument, so
>> that it could work not only for errno
>
> Indeed, it'd be useful for GetLastError() as well, etc.





More information about the cffi-devel mailing list