diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2015-12-22 14:39:19 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2015-12-22 14:39:19 +0100 |
commit | 2cf3e1aa7477b813ca3ebb901003a7d44f970218 (patch) | |
tree | 4380aa7e763a72cdc51c6e4e198e633e56801762 /sysdeps/generic | |
parent | 661a29a518245e5e82bc51bf290a2f43a0991714 (diff) | |
download | glibc-2cf3e1aa7477b813ca3ebb901003a7d44f970218.tar glibc-2cf3e1aa7477b813ca3ebb901003a7d44f970218.tar.gz glibc-2cf3e1aa7477b813ca3ebb901003a7d44f970218.tar.bz2 glibc-2cf3e1aa7477b813ca3ebb901003a7d44f970218.zip |
Harmonize generic stdio-lock support with nptl
This fixes build when _IO_funlockfile is a macro, fixes build where
_IO_acquire_lock_clear_flags2 is used, and fixes unlocking on unexpected
stack unwind.
* sysdeps/generic/stdio-lock.h [__EXCEPTIONS] (_IO_acquire_lock,
_IO_release_lock ): Use cleanup attribute on new
_IO_acquire_lock_file variable instead of assuming that
_IO_release_lock will be called.
[!__EXCEPTIONS] (_IO_acquire_lock): Define to non-existing
_IO_acquire_lock_needs_exceptions_enabled.
(_IO_acquire_lock_clear_flags2): New macro.
Diffstat (limited to 'sysdeps/generic')
-rw-r--r-- | sysdeps/generic/stdio-lock.h | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/sysdeps/generic/stdio-lock.h b/sysdeps/generic/stdio-lock.h index 38f93efce9..5f232f99a9 100644 --- a/sysdeps/generic/stdio-lock.h +++ b/sysdeps/generic/stdio-lock.h @@ -45,13 +45,26 @@ __libc_lock_define_recursive (typedef, _IO_lock_t) __libc_cleanup_region_end (_doit) #if defined _LIBC && IS_IN (libc) + +# ifdef __EXCEPTIONS # define _IO_acquire_lock(_fp) \ - _IO_cleanup_region_start ((void (*) (void *)) _IO_funlockfile, (_fp)); \ - _IO_flockfile (_fp) + do { \ + _IO_FILE *_IO_acquire_lock_file \ + __attribute__((cleanup (_IO_acquire_lock_fct))) \ + = (_fp); \ + _IO_flockfile (_IO_acquire_lock_file); +# define _IO_acquire_lock_clear_flags2(_fp) \ + do { \ + _IO_FILE *_IO_acquire_lock_file \ + __attribute__((cleanup (_IO_acquire_lock_clear_flags2_fct))) \ + = (_fp); \ + _IO_flockfile (_IO_acquire_lock_file); +# else +# define _IO_acquire_lock(_fp) _IO_acquire_lock_needs_exceptions_enabled +# define _IO_acquire_lock_clear_flags2(_fp) _IO_acquire_lock (_fp) +# endif +# define _IO_release_lock(_fp) ; } while (0) -# define _IO_release_lock(_fp) \ - _IO_funlockfile (_fp); \ - _IO_cleanup_region_end (0) #endif #endif /* stdio-lock.h */ |