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.
This commit is contained in:
@@ -65,16 +65,16 @@ _DEFUN (atexit,
|
||||
{
|
||||
register struct _atexit *p;
|
||||
|
||||
/* _REENT_SMALL atexit() doesn't allow more than the required 32 entries. */
|
||||
/* _REENT_SMALL atexit() doesn't allow more than the required 32 entries. */
|
||||
#ifndef _REENT_SMALL
|
||||
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;
|
||||
}
|
||||
|
@@ -60,20 +60,43 @@ _DEFUN (exit, (code),
|
||||
int code)
|
||||
{
|
||||
register struct _atexit *p;
|
||||
register struct _on_exit_args * args;
|
||||
register int n;
|
||||
int i = 1;
|
||||
int i;
|
||||
|
||||
p = &_REENT->_atexit;
|
||||
|
||||
#ifdef _REENT_SMALL
|
||||
for (p = &_REENT->_atexit, n = p->_ind-1, i = (n>=0) ? (1<<n) : 0;
|
||||
n >= 0; --n, i >>= 1)
|
||||
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
|
||||
for (p = _REENT->_atexit; p; p = p->_next)
|
||||
for (n = p->_ind - 1, i = (n >= 0) ? (1 << n) : 0; n >= 0; --n, i >>= 1)
|
||||
do
|
||||
{
|
||||
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;
|
||||
}
|
||||
while (p);
|
||||
#endif
|
||||
if (p->_fntypes & i)
|
||||
(*((void (*)(int, void *))p->_fns[n]))(code, p->_fnargs[n]);
|
||||
else
|
||||
(*p->_fns[n]) ();
|
||||
|
||||
if (_REENT->__cleanup)
|
||||
(*_REENT->__cleanup) (_REENT);
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user