* 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.
This commit is contained in:
		| @@ -1,3 +1,11 @@ | |||||||
|  | 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. | ||||||
|  |  | ||||||
| 2010-01-29  Jeff Johnston  <jjohnstn@redhat.com> | 2010-01-29  Jeff Johnston  <jjohnstn@redhat.com> | ||||||
|  |  | ||||||
| 	* libc/search/Makefile.am: Create .def files for bsearch and qsort. | 	* libc/search/Makefile.am: Create .def files for bsearch and qsort. | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ | |||||||
|  |  | ||||||
| /* Make this a weak reference to avoid pulling in malloc.  */ | /* Make this a weak reference to avoid pulling in malloc.  */ | ||||||
| void * malloc(size_t) _ATTRIBUTE((__weak__)); | void * malloc(size_t) _ATTRIBUTE((__weak__)); | ||||||
|  | __LOCK_INIT(, __atexit_lock); | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Register a function to be performed at exit or on shared library unload. |  * Register a function to be performed at exit or on shared library unload. | ||||||
| @@ -27,9 +28,7 @@ _DEFUN (__register_exitproc, | |||||||
|   register struct _atexit *p; |   register struct _atexit *p; | ||||||
|  |  | ||||||
| #ifndef __SINGLE_THREAD__ | #ifndef __SINGLE_THREAD__ | ||||||
|   __LOCK_INIT(static, lock); |   __lock_acquire(__atexit_lock); | ||||||
|  |  | ||||||
|   __lock_acquire(lock); |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   p = _GLOBAL_REENT->_atexit; |   p = _GLOBAL_REENT->_atexit; | ||||||
| @@ -49,7 +48,7 @@ _DEFUN (__register_exitproc, | |||||||
|       if (p == NULL) |       if (p == NULL) | ||||||
| 	{ | 	{ | ||||||
| #ifndef __SINGLE_THREAD__ | #ifndef __SINGLE_THREAD__ | ||||||
| 	  __lock_release(lock); | 	  __lock_release(__atexit_lock); | ||||||
| #endif | #endif | ||||||
| 	  return -1; | 	  return -1; | ||||||
| 	} | 	} | ||||||
| @@ -94,7 +93,7 @@ _DEFUN (__register_exitproc, | |||||||
|     } |     } | ||||||
|   p->_fns[p->_ind++] = fn; |   p->_fns[p->_ind++] = fn; | ||||||
| #ifndef __SINGLE_THREAD__ | #ifndef __SINGLE_THREAD__ | ||||||
|   __lock_release(lock); |   __lock_release(__atexit_lock); | ||||||
| #endif | #endif | ||||||
|   return 0; |   return 0; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -10,6 +10,10 @@ | |||||||
| /* Make this a weak reference to avoid pulling in free.  */ | /* Make this a weak reference to avoid pulling in free.  */ | ||||||
| void free(void *) _ATTRIBUTE((__weak__)); | 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, |  * Call registered exit handlers.  If D is null then all handlers are called, | ||||||
|  * otherwise only the handlers from that DSO are called. |  * otherwise only the handlers from that DSO are called. | ||||||
| @@ -26,6 +30,11 @@ _DEFUN (__call_exitprocs, (code, d), | |||||||
|   int i; |   int i; | ||||||
|   void (*fn) (void); |   void (*fn) (void); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifndef __SINGLE_THREAD__ | ||||||
|  |   __lock_acquire(__atexit_lock); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  restart: |  restart: | ||||||
|  |  | ||||||
|   p = _GLOBAL_REENT->_atexit; |   p = _GLOBAL_REENT->_atexit; | ||||||
| @@ -104,4 +113,8 @@ _DEFUN (__call_exitprocs, (code, d), | |||||||
| 	} | 	} | ||||||
| #endif | #endif | ||||||
|     } |     } | ||||||
|  | #ifndef __SINGLE_THREAD__ | ||||||
|  |   __lock_release(__atexit_lock); | ||||||
|  | #endif | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user