From 000160a268fe8a04265f24278907e9602823fc61 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 12 Dec 2002 02:28:37 +0000 Subject: [PATCH] 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. --- nptl/ChangeLog | 7 +++++++ nptl/sysdeps/pthread/bits/libc-lock.h | 11 ++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/nptl/ChangeLog b/nptl/ChangeLog index cc8ac2a..a679621 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,5 +1,12 @@ 2002-12-11 Ulrich Drepper + * 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 static lib by preventing gcc from being too clever. diff --git a/nptl/sysdeps/pthread/bits/libc-lock.h b/nptl/sysdeps/pthread/bits/libc-lock.h index cb21549..de2ec7b 100644 --- a/nptl/sysdeps/pthread/bits/libc-lock.h +++ b/nptl/sysdeps/pthread/bits/libc-lock.h @@ -336,23 +336,28 @@ typedef pthread_key_t __libc_key_t; /* Start critical region with cleanup. */ #define __libc_cleanup_region_start(DOIT, FCT, ARG) \ { struct _pthread_cleanup_buffer _buffer; \ - int _avail = (DOIT) && _pthread_cleanup_push_defer != NULL; \ + int _avail = _pthread_cleanup_push_defer != NULL; \ if (_avail) { \ _pthread_cleanup_push_defer (&_buffer, (FCT), (ARG)); \ + } else if (DOIT) { \ + _buffer.__routine = (FCT); \ + _buffer.__arg = (ARG); \ } /* End critical region with cleanup. */ #define __libc_cleanup_region_end(DOIT) \ if (_avail) { \ _pthread_cleanup_pop_restore (&_buffer, (DOIT)); \ - } \ + } else if (DOIT) \ + _buffer.__routine (_buffer.__arg); \ } /* Sometimes we have to exit the block in the middle. */ #define __libc_cleanup_end(DOIT) \ if (_avail) { \ _pthread_cleanup_pop_restore (&_buffer, (DOIT)); \ - } + } else if (DOIT) \ + _buffer.__routine (_buffer.__arg) /* Create thread-specific key. */ #define __libc_key_create(KEY, DESTRUCTOR) \ -- 2.7.4