The Errno Story

Wolfgang Thaller wolfgang.thaller at gmx.net
Thu Jul 24 17:48:02 EDT 2003


First, the "bug" part:

None of the libraries that use errno are compatible with concurrency.
When a (lightweight) thread-switch occurs between the call to some 
foreign function and the corresponding call to 
Foreign.C.Error.getErrno, we have a problem:

a) the RTS trashes the value of errno
b) another Haskell thread might call a function that sets errno
c) on most platforms, errno is thread-local state, with all the 
consequences that has for the threaded RTS (bound threads required....)

Now, the "ffi" part:

b) and c) could be solved by using bound threads, but that's probably 
too inefficient for something that's used as frequently as errno.
Bound threads wouldn't solve a).

I therefore propose that we make the RTS save & restore the value of 
errno in the TSO, thus making errno "Haskell-Thread-Local-State", and 
solving all of the above problems.
I also propose adding a note to the FFI spec (or the bound threads 
document, I'm not sure which is the right place) that says that 
implementations have to make sure that "Errno" is local to each 
*Haskell* thread.


Cheers,

Wolfgang




More information about the FFI mailing list