Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/stdlib/exit.c')
-rw-r--r--newlib/libc/stdlib/exit.c43
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