This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: The thread model in newlib



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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]