The thread model in newlib
Leif Ekblad
leif@rdos.net
Fri Dec 16 22:30:00 GMT 2005
> Have you looked at more recent sources? For example, there is now a
> __DYNAMIC_REENT__ flag which tells newlib you will be providing a
> routine __getreent() to select the current thread's reentrancy
> structure.
OK. It seems like this macro is defined in config.h if the __linux__ define
is active. I suppose I can change here to make it active for __RDOS__
as well.
Besides, I remember why I had to patch for this in 1.10. Without a
function call to get the current thread's reent structure, you must
modify the pointer with every thread-switch. This was pretty much
out of the question since RDOS have kernel threads.
> This removes the need of the user-code to call _r routines
> with a specific reentrant structure (the _REENT macro is redefined to
> call __getreent()).
Yes, is this a major improvement.
> In the internal code, for example, you just include
> errno.h and set errno directly. The macros take care of everything so
> that the __getreent() function gets called under the covers and the
> errno value is placed in the correct thread context. In your situation,
> you could write a __getreent() routine that referred to a special
> pointer in TLS that is initialized at thread creation.
Yes, this is how I patched 1.10 too. I let the thread-creation code
allocate a FS selector unique to each thread. Since a thread-switch
saves all registers, this works as it should.
> Also note there is a implementation of linuxthreads in the
> libc/sys/linux /linuxthreads directory that builds for i386. Newlib
> altered the linuxthreads code to add the initialization of the reentrant
> structure for new threads and placing the pointer in a control structure
> to be accessed at any time. If you supply most or all of the syscalls
> that Linux does, you probably can use a great deal of the thread code.
Isn't linuxthreads an application implementation of threads rather than
a kernel implementation?
> Regarding your request to not supply _r routines: the Linux port
> specifies -DMISSING_SYSCALL_NAMES in configure.host as it directly
> supplies reentrant syscalls (i.e. no _r syscalls are required). You
> would want to do this as well.
OK, I can see how this works.
I see that the Linux implementation has lots of code in newlib. Is this
the preferred way to support a new OS? I also see that some systems
use newlib/libc/sys while some others use libgloss/sys. What is the
difference and what exactly is libgloss?
Regards,
Leif Ekblad
More information about the Newlib
mailing list