aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc/stdlib/on_exit.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2003-06-06 15:36:31 +0000
committerNick Clifton <nickc@redhat.com>2003-06-06 15:36:31 +0000
commit75d7d177004358ba5e410a2cd98f2249b6c4e1b3 (patch)
treefc1541e54ea04ed5a4260fbc60e578424945e2ef /newlib/libc/stdlib/on_exit.c
parent54152c7e7ed656c969fe4536f17f66360cd8d971 (diff)
downloadnewlib-75d7d177004358ba5e410a2cd98f2249b6c4e1b3.zip
newlib-75d7d177004358ba5e410a2cd98f2249b6c4e1b3.tar.gz
newlib-75d7d177004358ba5e410a2cd98f2249b6c4e1b3.tar.bz2
New structure containing fields used by the on_exit() function.
(struct _atexit): Include struct _on_exit_args. For _REENT_SMALL do his via a pointer that is initialised when needed.
Diffstat (limited to 'newlib/libc/stdlib/on_exit.c')
-rw-r--r--newlib/libc/stdlib/on_exit.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/newlib/libc/stdlib/on_exit.c b/newlib/libc/stdlib/on_exit.c
index 1b6cd2a..b7bf6f3 100644
--- a/newlib/libc/stdlib/on_exit.c
+++ b/newlib/libc/stdlib/on_exit.c
@@ -68,29 +68,40 @@ _DEFUN (on_exit,
_VOID _EXFUN ((*fn), (int, _PTR)) _AND
_PTR arg)
{
+ struct _on_exit_args * args;
register struct _atexit *p;
void (*x)(void) = (void (*)(void))fn;
/* _REENT_SMALL on_exit() doesn't allow more than the required 32 entries. */
-#ifndef _REENT_SMALL
+#ifdef _REENT_SMALL
+ p = &_REENT->_atexit;
+ if (p->_ind >= _ATEXIT_SIZE)
+ return -1;
+ args = p->_on_exit_args_ptr;
+ if (args == NULL)
+ {
+ args = malloc (sizeof * p->_on_exit_args_ptr);
+ if (args == NULL)
+ return -1;
+ args->_fntypes = 0;
+ p->_on_exit_args_ptr = args;
+ }
+#else
if ((p = _REENT->_atexit) == NULL)
_REENT->_atexit = p = &_REENT->_atexit0;
if (p->_ind >= _ATEXIT_SIZE)
{
if ((p = (struct _atexit *) malloc (sizeof *p)) == NULL)
- return -1;
+ return -1;
p->_ind = 0;
- p->_fntypes = 0;
+ p->_on_exit_args._fntypes = 0;
p->_next = _REENT->_atexit;
_REENT->_atexit = p;
}
-#else
- p = &_REENT->_atexit;
- if (p->_ind >= _ATEXIT_SIZE)
- return -1;
+ args = & p->_on_exit_args;
#endif
- p->_fntypes |= (1 << p->_ind);
- p->_fnargs[p->_ind] = arg;
+ args->_fntypes |= (1 << p->_ind);
+ args->_fnargs[p->_ind] = arg;
p->_fns[p->_ind++] = x;
return 0;
}