This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Ping? Re: [RFA] More aggressive use of atexit locking


Ping?

I'd like to check this in so that I can roll a new cygwin snapshot.  I
think it fixes a longstanding problem in newlib.

cgf

On Mon, Feb 01, 2010 at 09:10:54PM -0500, Christopher Faylor wrote:
>It seems like we should be locking both the feeder and the emptier for
>atexit operations shouldn't we?  Otherwise one can be deleting things
>while another is adding things.  This is especially important for the
>__cxa_* functions since the emptier can be called at any time, not just
>on process exit.
>
>Ok to commit?
>
>cgf
>
>2010-02-01  Christopher Faylor  <me+cygwin@cgf.cx>
>
>	* libc/stdlib/__atexit.c (__atexit_lock): Define a global lock for
>	atexit functions.
>	(__register_exitproc): Use __atexit_lock rather than a local static
>	lock.
>	* libc/stdlib/__call_atexit.c: Ditto.
>
>Index: libc/stdlib/__atexit.c
>===================================================================
>RCS file: /cvs/uberbaum/newlib/libc/stdlib/__atexit.c,v
>retrieving revision 1.5
>diff -d -u -p -r1.5 __atexit.c
>--- libc/stdlib/__atexit.c	23 Apr 2009 17:54:22 -0000	1.5
>+++ libc/stdlib/__atexit.c	2 Feb 2010 02:00:55 -0000
>@@ -10,6 +10,7 @@
> 
> /* Make this a weak reference to avoid pulling in malloc.  */
> void * malloc(size_t) _ATTRIBUTE((__weak__));
>+__LOCK_INIT(, __atexit_lock);
> 
> /*
>  * Register a function to be performed at exit or on shared library unload.
>@@ -27,9 +28,7 @@ _DEFUN (__register_exitproc,
>   register struct _atexit *p;
> 
> #ifndef __SINGLE_THREAD__
>-  __LOCK_INIT(static, lock);
>-
>-  __lock_acquire(lock);
>+  __lock_acquire(__atexit_lock);
> #endif
> 
>   p = _GLOBAL_REENT->_atexit;
>@@ -49,7 +48,7 @@ _DEFUN (__register_exitproc,
>       if (p == NULL)
> 	{
> #ifndef __SINGLE_THREAD__
>-	  __lock_release(lock);
>+	  __lock_release(__atexit_lock);
> #endif
> 	  return -1;
> 	}
>@@ -94,7 +93,7 @@ _DEFUN (__register_exitproc,
>     }
>   p->_fns[p->_ind++] = fn;
> #ifndef __SINGLE_THREAD__
>-  __lock_release(lock);
>+  __lock_release(__atexit_lock);
> #endif
>   return 0;
> }
>Index: libc/stdlib/__call_atexit.c
>===================================================================
>RCS file: /cvs/uberbaum/newlib/libc/stdlib/__call_atexit.c,v
>retrieving revision 1.6
>diff -d -u -p -r1.6 __call_atexit.c
>--- libc/stdlib/__call_atexit.c	23 Apr 2009 17:54:22 -0000	1.6
>+++ libc/stdlib/__call_atexit.c	2 Feb 2010 02:00:55 -0000
>@@ -10,6 +10,10 @@
> /* Make this a weak reference to avoid pulling in free.  */
> void free(void *) _ATTRIBUTE((__weak__));
> 
>+#ifndef __SINGLE_THREAD__
>+extern _LOCK_T __atexit_lock;
>+#endif
>+
> /*
>  * Call registered exit handlers.  If D is null then all handlers are called,
>  * otherwise only the handlers from that DSO are called.
>@@ -26,6 +30,11 @@ _DEFUN (__call_exitprocs, (code, d),
>   int i;
>   void (*fn) (void);
> 
>+
>+#ifndef __SINGLE_THREAD__
>+  __lock_acquire(__atexit_lock);
>+#endif
>+
>  restart:
> 
>   p = _GLOBAL_REENT->_atexit;
>@@ -104,4 +113,8 @@ _DEFUN (__call_exitprocs, (code, d),
> 	}
> #endif
>     }
>+#ifndef __SINGLE_THREAD__
>+  __lock_release(__atexit_lock);
>+#endif
>+
> }
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]