From 2cf3e1aa7477b813ca3ebb901003a7d44f970218 Mon Sep 17 00:00:00 2001
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date: Tue, 22 Dec 2015 14:39:19 +0100
Subject: 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.
---
 sysdeps/generic/stdio-lock.h | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

(limited to 'sysdeps')

diff --git a/sysdeps/generic/stdio-lock.h b/sysdeps/generic/stdio-lock.h
index 38f93ef..5f232f9 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 */
-- 
cgit v1.1