diff options
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | bits/libc-lock.h | 21 | ||||
-rw-r--r-- | linuxthreads/ChangeLog | 9 | ||||
-rw-r--r-- | linuxthreads/sysdeps/pthread/bits/libc-lock.h | 10 | ||||
-rw-r--r-- | linuxthreads/sysdeps/pthread/bits/stdio-lock.h | 47 | ||||
-rw-r--r-- | sysdeps/generic/bits/libc-lock.h | 21 |
6 files changed, 46 insertions, 63 deletions
@@ -16,6 +16,7 @@ any cleanup handler. (__libc_cleanup_region_end): Do nothing if start's DOIT arg was zero. (__libc_cleanup_end): Likewise. + * sysdeps/generic/bits/libc-lock.h: Same changes. * stdio-common/vfscanf.c (LOCK_STREAM): Pass new arg. * stdio-common/vfprintf.c (buffered_vfprintf, vfprintf): Likewise. * sysdeps/mach/hurd/bits/stdio-lock.h (_IO_cleanup_region_start): diff --git a/bits/libc-lock.h b/bits/libc-lock.h index ca90d35c95..700ebd6062 100644 --- a/bits/libc-lock.h +++ b/bits/libc-lock.h @@ -94,14 +94,23 @@ } while (0) -/* Start critical region with cleanup. */ -#define __libc_cleanup_region_start(FCT, ARG) - -/* End critical region with cleanup. */ -#define __libc_cleanup_region_end(DOIT) +/* Start a critical region with a cleanup function */ +#define __libc_cleanup_region_start(DOIT, FCT, ARG) \ +{ \ + typeof (***(FCT)) *__save_FCT = (DOIT) ? (FCT) : 0; \ + typeof (ARG) __save_ARG = ARG; \ + /* close brace is in __libc_cleanup_region_end below. */ + +/* End a critical region started with __libc_cleanup_region_start. */ +#define __libc_cleanup_region_end(DOIT) \ + if ((DOIT) && __save_FCT != 0) \ + (*__save_FCT)(__save_ARG); \ +} /* Sometimes we have to exit the block in the middle. */ -#define __libc_cleanup_end(DOIT) +#define __libc_cleanup_end(DOIT) \ + if ((DOIT) && __save_FCT != 0) \ + (*__save_FCT)(__save_ARG); \ /* We need portable names for some of the functions. */ diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index fcb2e07316..65a2077939 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,12 @@ +2001-08-23 Roland McGrath <roland@frob.com> + + * sysdeps/pthread/bits/libc-lock.h (__libc_cleanup_region_start): Take + new first argument, skip the cleanup handler if it's zero. + (_LIBC_LOCK_RECURSIVE_INITIALIZER): New macro. + (__libc_lock_define_initialized_recursive): Use it. + * sysdeps/pthread/bits/stdio-lock.h: File removed. + The sysdeps/generic file from the main tree now suffices. + 2001-08-22 Roland McGrath <roland@frob.com> * sysdeps/pthread/bits/stdio-lock.h: Include <bits/libc-lock.h> diff --git a/linuxthreads/sysdeps/pthread/bits/libc-lock.h b/linuxthreads/sysdeps/pthread/bits/libc-lock.h index fc68979aab..866e89d510 100644 --- a/linuxthreads/sysdeps/pthread/bits/libc-lock.h +++ b/linuxthreads/sysdeps/pthread/bits/libc-lock.h @@ -72,8 +72,10 @@ typedef pthread_key_t __libc_key_t; /* Define an initialized recursive lock variable NAME with storage class CLASS. */ -#define __libc_lock_define_initialized_recursive(CLS,NAME) \ - CLS __libc_lock_recursive_t NAME = {PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP}; +#define __libc_lock_define_initialized_recursive(CLASS,NAME) \ + CLASS __libc_lock_recursive_t NAME = _LIBC_LOCK_RECURSIVE_INITIALIZER; +#define _LIBC_LOCK_RECURSIVE_INITIALIZER \ + {PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP} /* Initialize the named lock variable, leaving it in a consistent, unlocked state. */ @@ -164,9 +166,9 @@ typedef pthread_key_t __libc_key_t; /* Start critical region with cleanup. */ -#define __libc_cleanup_region_start(FCT, ARG) \ +#define __libc_cleanup_region_start(DOIT, FCT, ARG) \ { struct _pthread_cleanup_buffer _buffer; \ - int _avail = _pthread_cleanup_push_defer != NULL; \ + int _avail = (DOIT) && _pthread_cleanup_push_defer != NULL; \ if (_avail) { \ _pthread_cleanup_push_defer (&_buffer, (FCT), (ARG)); \ } diff --git a/linuxthreads/sysdeps/pthread/bits/stdio-lock.h b/linuxthreads/sysdeps/pthread/bits/stdio-lock.h deleted file mode 100644 index 4dc7dcfc52..0000000000 --- a/linuxthreads/sysdeps/pthread/bits/stdio-lock.h +++ /dev/null @@ -1,47 +0,0 @@ -/* Thread package specific definitions of stream lock type. - Copyright (C) 1996, 1997, 1998, 2000, 2001 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include <bits/libc-lock.h> - -__libc_lock_define_recursive (typedef, _IO_lock_t) - -/* We need recursive (counting) mutexes. */ -#define _IO_lock_initializer {PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP} - -#define _IO_lock_init(_name) __libc_lock_init_recursive (_name) -#define _IO_lock_fini(_name) __libc_lock_fini_recursive (_name) -#define _IO_lock_lock(_name) __libc_lock_lock_recursive (_name) -#define _IO_lock_unlock(_name) __libc_lock_unlock_recursive (_name) - - -#define _IO_cleanup_region_start(_fct, _fp) \ - { struct _pthread_cleanup_buffer _buffer; \ - int _avail = (((_fp)->_flags & _IO_USER_LOCK) == 0 \ - && _pthread_cleanup_push_defer != NULL); \ - if (_avail) { \ - _pthread_cleanup_push_defer (&_buffer, (_fct), (_fp)); \ - } -#define _IO_cleanup_region_start_noarg(_fct) \ - { struct _pthread_cleanup_buffer _buffer; \ - int _avail = _pthread_cleanup_push_defer != NULL; \ - if (_avail) { \ - _pthread_cleanup_push_defer (&_buffer, (_fct), NULL); \ - } -#define _IO_cleanup_region_end(_doit) \ - __libc_cleanup_region_end (_doit) diff --git a/sysdeps/generic/bits/libc-lock.h b/sysdeps/generic/bits/libc-lock.h index ca90d35c95..700ebd6062 100644 --- a/sysdeps/generic/bits/libc-lock.h +++ b/sysdeps/generic/bits/libc-lock.h @@ -94,14 +94,23 @@ } while (0) -/* Start critical region with cleanup. */ -#define __libc_cleanup_region_start(FCT, ARG) - -/* End critical region with cleanup. */ -#define __libc_cleanup_region_end(DOIT) +/* Start a critical region with a cleanup function */ +#define __libc_cleanup_region_start(DOIT, FCT, ARG) \ +{ \ + typeof (***(FCT)) *__save_FCT = (DOIT) ? (FCT) : 0; \ + typeof (ARG) __save_ARG = ARG; \ + /* close brace is in __libc_cleanup_region_end below. */ + +/* End a critical region started with __libc_cleanup_region_start. */ +#define __libc_cleanup_region_end(DOIT) \ + if ((DOIT) && __save_FCT != 0) \ + (*__save_FCT)(__save_ARG); \ +} /* Sometimes we have to exit the block in the middle. */ -#define __libc_cleanup_end(DOIT) +#define __libc_cleanup_end(DOIT) \ + if ((DOIT) && __save_FCT != 0) \ + (*__save_FCT)(__save_ARG); \ /* We need portable names for some of the functions. */ |