summary refs log tree commit diff
path: root/nptl/pthreadP.h
diff options
context:
space:
mode:
authorMartin Sebor <msebor@gcc.gnu.org>2015-07-09 19:25:38 -0400
committerMartin Sebor <msebor@gcc.gnu.org>2015-07-09 19:27:06 -0400
commit203c1a898dd2e281eae30f3c57ceb8d4a50b00f4 (patch)
tree361cc14f5511e02bbd500aed53ec5313714cfdb8 /nptl/pthreadP.h
parent2193ce8746ec11b2325cc55aa8f338d5872492bf (diff)
downloadglibc-203c1a898dd2e281eae30f3c57ceb8d4a50b00f4.tar.gz
glibc-203c1a898dd2e281eae30f3c57ceb8d4a50b00f4.tar.xz
glibc-203c1a898dd2e281eae30f3c57ceb8d4a50b00f4.zip
The patch committed to fix bug #18435 caused regressions on aarch64
and also powerpc64 and powerpc64le. See the discussion in the thread
below for details. This change reverts the problematic bits leaving
the added test in place and marking XFAIL in anticipation of fixing
the bug in the near future.
https://sourceware.org/ml/libc-alpha/2015-07/msg00141.html

	[BZ #18435]
	* nptl/pthreadP.h (pthread_cleanup_push, pthread_cleanup_pop):
	Revert commit ed225df3ad9cbac3c22ec3f0fbbed1f9c61d1c54.
	* nptl/Makefile (test-xfail-tst-once5): Define.
Diffstat (limited to 'nptl/pthreadP.h')
-rw-r--r--nptl/pthreadP.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index 72d3e23b95..8cd51c65ad 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -537,8 +537,19 @@ extern void __pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
 				    void (*routine) (void *), void *arg)
      attribute_hidden;
 
+/* Replace cleanup macros defined in <pthread.h> with internal
+   versions that don't depend on unwind info and better support
+   cancellation.  */
+# undef pthread_cleanup_push
+# define pthread_cleanup_push(routine,arg)              \
+  { struct _pthread_cleanup_buffer _buffer;             \
+  __pthread_cleanup_push (&_buffer, (routine), (arg));
+
 extern void __pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer,
 				   int execute) attribute_hidden;
+# undef pthread_cleanup_pop
+# define pthread_cleanup_pop(execute)                   \
+  __pthread_cleanup_pop (&_buffer, (execute)); }
 #endif
 
 extern void __pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer,