Newlib reentrancy
Sebastian Huber
sebastian.huber at embedded-brains.de
Mon Apr 22 08:54:11 UTC 2013
Hello,
Newlib stores all global state in a so called reentrancy structure, e.g. errno,
stdin, random number state, etc. In RTEMS every thread can have its own
reentrancy structure (a reference it is part of the thread control block). In
Newlib there are two mechanisms to access the executing thread's reentrancy
structure
1. via a global pointer _impure_ptr, or
2. via a function __getreent().
See also:
http://sourceware.org/ml/newlib/2013/msg00031.html
Currently RTEMS uses option 1. The global pointer is updated during a thread
dispatch in threaddispatch.c.
The option 1. is unsuitable for SMP since here a global pointer cannot be used
to store thread specific data. I suggest to use option 2. for RTEMS. For the
single-processor RTEMS this has the benefit that the thread dispatch code is
simplified, e.g. the code block
/*
* Switch libc's task specific data.
*/
if ( _Thread_libc_reent ) {
executing->libc_reent = *_Thread_libc_reent;
*_Thread_libc_reent = heir->libc_reent;
}
can be removed. The execution time of _Thread_Dispatch() is critical for the
interrupt and thread switch latency.
The implementation of __getreent() for RTEMS is easy:
struct _reent *__getreent(void)
{
struct _reent *reent = _Thread_Executing->libc_reent;
if ( reent == NULL ) {
reent = _global_impure_ptr;
}
return reent;
}
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.huber at embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
More information about the devel
mailing list