* 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:
parent
aec8c3d510
commit
fa40bd922e
|
@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue