From 2cf3e1aa7477b813ca3ebb901003a7d44f970218 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Tue, 22 Dec 2015 14:39:19 +0100 Subject: [PATCH] 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. --- ChangeLog | 16 ++++++++++++++++ sysdeps/generic/stdio-lock.h | 25 +++++++++++++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3c15a055d4..a57db54b46 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2015-12-22 Samuel Thibault + + 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. + 2015-12-22 Adhemerval Zanella * sysdeps/powerpc/fpu/libm-test-ulps: Regenerated. 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) -# define _IO_acquire_lock(_fp) \ - _IO_cleanup_region_start ((void (*) (void *)) _IO_funlockfile, (_fp)); \ - _IO_flockfile (_fp) -# define _IO_release_lock(_fp) \ - _IO_funlockfile (_fp); \ - _IO_cleanup_region_end (0) +# ifdef __EXCEPTIONS +# define _IO_acquire_lock(_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) + #endif #endif /* stdio-lock.h */