diff options
Diffstat (limited to 'newlib/libc/stdlib/__atexit.c')
-rw-r--r-- | newlib/libc/stdlib/__atexit.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/newlib/libc/stdlib/__atexit.c b/newlib/libc/stdlib/__atexit.c index 4687d0023..f04f00d8e 100644 --- a/newlib/libc/stdlib/__atexit.c +++ b/newlib/libc/stdlib/__atexit.c @@ -10,7 +10,17 @@ /* Make this a weak reference to avoid pulling in malloc. */ void * malloc(size_t) _ATTRIBUTE((__weak__)); -__LOCK_INIT_RECURSIVE(, __atexit_lock); + +#ifndef __SINGLE_THREAD__ +extern _LOCK_RECURSIVE_T __atexit_lock; +#endif + +#ifdef _REENT_GLOBAL_ATEXIT +static struct _atexit _global_atexit0 = _ATEXIT_INIT; +# define _GLOBAL_ATEXIT0 (&_global_atexit0) +#else +# define _GLOBAL_ATEXIT0 (&_GLOBAL_REENT->_atexit0) +#endif /* * Register a function to be performed at exit or on shared library unload. @@ -31,9 +41,9 @@ _DEFUN (__register_exitproc, __lock_acquire_recursive(__atexit_lock); #endif - p = _GLOBAL_REENT->_atexit; + p = _GLOBAL_ATEXIT; if (p == NULL) - _GLOBAL_REENT->_atexit = p = &_GLOBAL_REENT->_atexit0; + _GLOBAL_ATEXIT = p = _GLOBAL_ATEXIT0; if (p->_ind >= _ATEXIT_SIZE) { #ifndef _ATEXIT_DYNAMIC_ALLOC @@ -53,8 +63,8 @@ _DEFUN (__register_exitproc, return -1; } p->_ind = 0; - p->_next = _GLOBAL_REENT->_atexit; - _GLOBAL_REENT->_atexit = p; + p->_next = _GLOBAL_ATEXIT; + _GLOBAL_ATEXIT = p; #ifndef _REENT_SMALL p->_on_exit_args._fntypes = 0; p->_on_exit_args._is_cxa = 0; |