Ping? Re: [RFA] More aggressive use of atexit locking
Christopher Faylor
cgf-use-the-mailinglist-please@sourceware.org
Thu Feb 4 17:20:00 GMT 2010
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
>+
> }
>
More information about the Newlib
mailing list