* sysdeps/pthread/bits/libc-lock.h (__libc_cleanup_region_start):
	Remember function and argument even if cancellation handler
	function is not available.
	(__libc_cleanup_region_end): Execute registered function directly if
	pthread functions are not available.
	(__libc_cleanup_end): Likewise.
This commit is contained in:
Ulrich Drepper 2002-12-12 02:28:37 +00:00
parent f494b70b55
commit 000160a268
2 changed files with 15 additions and 3 deletions

View File

@ -1,5 +1,12 @@
2002-12-11 Ulrich Drepper <drepper@redhat.com> 2002-12-11 Ulrich Drepper <drepper@redhat.com>
* sysdeps/pthread/bits/libc-lock.h (__libc_cleanup_region_start):
Remember function and argument even if cancellation handler
function is not available.
(__libc_cleanup_region_end): Execute registered function directly if
pthread functions are not available.
(__libc_cleanup_end): Likewise.
* init.c (__pthread_initialize_minimal): Fix initialization in * init.c (__pthread_initialize_minimal): Fix initialization in
static lib by preventing gcc from being too clever. static lib by preventing gcc from being too clever.

View File

@ -336,23 +336,28 @@ typedef pthread_key_t __libc_key_t;
/* Start critical region with cleanup. */ /* Start critical region with cleanup. */
#define __libc_cleanup_region_start(DOIT, FCT, ARG) \ #define __libc_cleanup_region_start(DOIT, FCT, ARG) \
{ struct _pthread_cleanup_buffer _buffer; \ { struct _pthread_cleanup_buffer _buffer; \
int _avail = (DOIT) && _pthread_cleanup_push_defer != NULL; \ int _avail = _pthread_cleanup_push_defer != NULL; \
if (_avail) { \ if (_avail) { \
_pthread_cleanup_push_defer (&_buffer, (FCT), (ARG)); \ _pthread_cleanup_push_defer (&_buffer, (FCT), (ARG)); \
} else if (DOIT) { \
_buffer.__routine = (FCT); \
_buffer.__arg = (ARG); \
} }
/* End critical region with cleanup. */ /* End critical region with cleanup. */
#define __libc_cleanup_region_end(DOIT) \ #define __libc_cleanup_region_end(DOIT) \
if (_avail) { \ if (_avail) { \
_pthread_cleanup_pop_restore (&_buffer, (DOIT)); \ _pthread_cleanup_pop_restore (&_buffer, (DOIT)); \
} \ } else if (DOIT) \
_buffer.__routine (_buffer.__arg); \
} }
/* Sometimes we have to exit the block in the middle. */ /* Sometimes we have to exit the block in the middle. */
#define __libc_cleanup_end(DOIT) \ #define __libc_cleanup_end(DOIT) \
if (_avail) { \ if (_avail) { \
_pthread_cleanup_pop_restore (&_buffer, (DOIT)); \ _pthread_cleanup_pop_restore (&_buffer, (DOIT)); \
} } else if (DOIT) \
_buffer.__routine (_buffer.__arg)
/* Create thread-specific key. */ /* Create thread-specific key. */
#define __libc_key_create(KEY, DESTRUCTOR) \ #define __libc_key_create(KEY, DESTRUCTOR) \