mirror of git://sourceware.org/git/glibc.git
Update.
* 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:
parent
f494b70b55
commit
000160a268
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) \
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue