errno issues.

Robert S. Thau kaffe@rufus.w3.org
Tue, 25 Aug 1998 18:33:51 -0400 (EDT)


Godmar Back writes:
 > If somebody writes a native library that makes use of calls that
 > set errno, they'll have to go through the syscall interface anyway.
 > The way this is currently done is by using convenience macros defined
 > in jsyscall.h, which native libs must include if they want to use read(),
 > write(), etc.  Note that there is no other way:  we assume we link
 > against a C library that is oblivious to our internal threading system,
 > hence we must protect calls to that library and errno ourselves.

FWIW, the Posix threads spec (pthreads) requires the threaded version
of <errno.h> to define errno as a preprocessor macro expanding to a
pointer to thread-specific data in some unspecified manner.  If a
userland implementation has a global variable pointing to some control
block for the currently running thread, then

  #define errno (__Pthr_current->errno)

or the moral equivalent is, I believe, OK, though most implementations
do something like

  extern int* __errno_location();
  #define errno (*__errno_location())

which imposes rather more overhead.  However, if you have kernel
threads on a multiprocessor system, so that multiple threads can be
literally running simultaneously, then the former approach requires
real voodoo to work effectively --- you have to store the
__Pthr_current (or whatever) variable in something like a register
which can have different values in different simultaneously running
threads, and that requires cooperation from the compiler.  (Which gcc
can provide if you've got a register to spare, but x86 processors tend
to get rather cramped).

Food for thought...

rst