[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