[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