libc_wrapup() and _Thread_Dispatch()

Sebastian Huber sebastian.huber at
Tue Apr 23 12:05:35 UTC 2013


why is libc_wrapup() a global function.  It is used only inside of newlibc_exit.c.

In libc_wrapup():

    *  This was already done if the user called exit() directly .

   if (_REENT != _global_impure_ptr) {
#if 0
       /*  Don't reclaim this one, just in case we do printfs
        *  on the way out to ROM.
       _REENT = _global_impure_ptr;

What is the reason for this code?  The Newlib exit() already calls 
__call_exitprocs() before it calls _exit().  According to POSIX _exit() shall 
not call functions registered with atexit() nor any registered signal handlers.

In _Thread_Dispatch():

      * Switch libc's task specific data.
     if ( _Thread_libc_reent ) {
       executing->libc_reent = *_Thread_libc_reent;
       *_Thread_libc_reent = heir->libc_reent;

What is the reason for the "executing->libc_reent = *_Thread_libc_reent;" 
assignment.  I think this is a bug since it destroys the value created by 
newlib_create_hook() for the initialization task.  From my point of view are 
the newlib hooks the only entities that should touch thread->libc_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
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

More information about the devel mailing list