[RFA] More aggressive use of atexit locking
Jeff Johnston
jjohnstn@redhat.com
Thu Feb 4 17:36:00 GMT 2010
On 01/02/10 09:10 PM, 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?
>
Yes, go ahead.
-- Jeff J.
> 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