* 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:
Christopher Faylor 2010-02-04 17:57:30 +00:00
parent aec8c3d510
commit fa40bd922e
3 changed files with 25 additions and 5 deletions

View File

@ -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.

View File

@ -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;
} }

View File

@ -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
} }