[PATCH] Fix atexit in multithreaded apps
Thomas Pfaff
tpfaff@gmx.net
Fri Sep 5 00:47:00 GMT 2003
This is a patch regarding the problem reported by Peter Garonne (see
http://sources.redhat.com/ml/newlib/2003/msg00526.html ).
It fixes another problem with __DYNAMIC_REENT__ in multithreaded apps.
Thomas
2003-08-30 Thomas Pfaff <tpfaff@gmx.net>
* libc/stdlib/atexit.c: Rename _REENT to _GLOBAL_REENT throughout.
* libc/stdlib/exit.c : Ditto.
* libc/stdlib/on_exit.c: Ditto.
-------------- next part --------------
Index: libc/stdlib/atexit.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdlib/atexit.c,v
retrieving revision 1.4
diff -u -r1.4 atexit.c
--- libc/stdlib/atexit.c 6 Jun 2003 15:36:31 -0000 1.4
+++ libc/stdlib/atexit.c 30 Aug 2003 19:53:31 -0000
@@ -67,19 +67,19 @@
/* _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 = _GLOBAL_REENT->_atexit) == NULL)
+ _GLOBAL_REENT->_atexit = p = &_GLOBAL_REENT->_atexit0;
if (p->_ind >= _ATEXIT_SIZE)
{
if ((p = (struct _atexit *) malloc (sizeof *p)) == NULL)
return -1;
p->_ind = 0;
p->_on_exit_args._fntypes = 0;
- p->_next = _REENT->_atexit;
- _REENT->_atexit = p;
+ p->_next = _GLOBAL_REENT->_atexit;
+ _GLOBAL_REENT->_atexit = p;
}
#else
- p = &_REENT->_atexit;
+ p = &_GLOBAL_REENT->_atexit;
if (p->_ind >= _ATEXIT_SIZE)
return -1;
#endif
Index: libc/stdlib/exit.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdlib/exit.c,v
retrieving revision 1.4
diff -u -r1.4 exit.c
--- libc/stdlib/exit.c 6 Jun 2003 15:36:31 -0000 1.4
+++ libc/stdlib/exit.c 30 Aug 2003 19:53:31 -0000
@@ -64,7 +64,7 @@
register int n;
int i;
- p = &_REENT->_atexit;
+ p = &_GLOBAL_REENT->_atexit;
#ifdef _REENT_SMALL
args = p->_on_exit_args_ptr;
@@ -98,8 +98,8 @@
while (p);
#endif
- if (_REENT->__cleanup)
- (*_REENT->__cleanup) (_REENT);
+ if (_GLOBAL_REENT->__cleanup)
+ (*_GLOBAL_REENT->__cleanup) (_GLOBAL_REENT);
_exit (code);
}
Index: libc/stdlib/on_exit.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdlib/on_exit.c,v
retrieving revision 1.2
diff -u -r1.2 on_exit.c
--- libc/stdlib/on_exit.c 6 Jun 2003 15:36:31 -0000 1.2
+++ libc/stdlib/on_exit.c 30 Aug 2003 19:53:31 -0000
@@ -74,7 +74,7 @@
/* _REENT_SMALL on_exit() doesn't allow more than the required 32 entries. */
#ifdef _REENT_SMALL
- p = &_REENT->_atexit;
+ p = &_GLOBAL_REENT->_atexit;
if (p->_ind >= _ATEXIT_SIZE)
return -1;
args = p->_on_exit_args_ptr;
@@ -87,16 +87,16 @@
p->_on_exit_args_ptr = args;
}
#else
- if ((p = _REENT->_atexit) == NULL)
- _REENT->_atexit = p = &_REENT->_atexit0;
+ if ((p = _GLOBAL_REENT->_atexit) == NULL)
+ _GLOBAL_REENT->_atexit = p = &_GLOBAL_REENT->_atexit0;
if (p->_ind >= _ATEXIT_SIZE)
{
if ((p = (struct _atexit *) malloc (sizeof *p)) == NULL)
return -1;
p->_ind = 0;
p->_on_exit_args._fntypes = 0;
- p->_next = _REENT->_atexit;
- _REENT->_atexit = p;
+ p->_next = _GLOBAL_REENT->_atexit;
+ _GLOBAL_REENT->_atexit = p;
}
args = & p->_on_exit_args;
#endif
More information about the Newlib
mailing list