diff options
Diffstat (limited to 'newlib/libc/stdlib/exit.c')
-rw-r--r-- | newlib/libc/stdlib/exit.c | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/newlib/libc/stdlib/exit.c b/newlib/libc/stdlib/exit.c index 195b72454..be96488c8 100644 --- a/newlib/libc/stdlib/exit.c +++ b/newlib/libc/stdlib/exit.c @@ -48,7 +48,8 @@ Supporting OS subroutines required: <<_exit>>. #include <stdlib.h> #include <unistd.h> /* for _exit() declaration */ #include <reent.h> -#include "atexit.h" + +#ifndef _REENT_ONLY /* * Exit, flushing stdio buffers if necessary. @@ -58,9 +59,47 @@ void _DEFUN (exit, (code), int code) { - __call_exitprocs (code, NULL); + register struct _atexit *p; + register struct _on_exit_args * args; + register int n; + int i; + +#ifdef _REENT_SMALL + p = &_GLOBAL_REENT->_atexit; + args = p->_on_exit_args_ptr; + + if (args == NULL) + { + for (n = p->_ind; n--;) + p->_fns[n] (); + } + else + { + for (n = p->_ind - 1, i = (n >= 0) ? (1 << n) : 0; n >= 0; --n, i >>= 1) + if (args->_fntypes & i) + (*((void (*)(int, void *)) p->_fns[n]))(code, args->_fnargs[n]); + else + p->_fns[n] (); + } +#else + p = _GLOBAL_REENT->_atexit; + while (p) + { + args = & p->_on_exit_args; + + for (n = p->_ind - 1, i = (n >= 0) ? (1 << n) : 0; n >= 0; --n, i >>= 1) + if (args->_fntypes & i) + (*((void (*)(int, void *)) p->_fns[n]))(code, args->_fnargs[n]); + else + p->_fns[n] (); + + p = p->_next; + } +#endif if (_GLOBAL_REENT->__cleanup) (*_GLOBAL_REENT->__cleanup) (_GLOBAL_REENT); _exit (code); } + +#endif |