diff options
author | Nick Clifton <nickc@redhat.com> | 2003-06-06 15:36:31 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2003-06-06 15:36:31 +0000 |
commit | 75d7d177004358ba5e410a2cd98f2249b6c4e1b3 (patch) | |
tree | fc1541e54ea04ed5a4260fbc60e578424945e2ef /newlib/libc/stdlib/on_exit.c | |
parent | 54152c7e7ed656c969fe4536f17f66360cd8d971 (diff) | |
download | newlib-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.c | 29 |
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; } |