about summary refs log tree commit diff
path: root/sysdeps/htl/libc-lockP.h
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2020-06-14 14:48:07 +0000
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2020-06-14 15:53:04 +0000
commit76fe4ef4be842e78e175a200f7afa4a567b57db2 (patch)
tree37761de40868d7b9b558142cc0beb546eac7f20c /sysdeps/htl/libc-lockP.h
parenta50efac19a1eb0a9dc6f5917ae299c0fbbf3c46b (diff)
downloadglibc-76fe4ef4be842e78e175a200f7afa4a567b57db2.tar.gz
glibc-76fe4ef4be842e78e175a200f7afa4a567b57db2.tar.xz
glibc-76fe4ef4be842e78e175a200f7afa4a567b57db2.zip
htl: Fix cleanup support for IO locking
* sysdeps/htl/stdio-lock.h: New file, registers locking cleanup to htl.
* sysdeps/htl/libc-lockP.h: Include <libc-lock.h>.
(__libc_cleanup_region_start, __libc_cleanup_end,
__libc_cleanup_region_end): Override macros from <libc-lock.h> with
versions which register cleanup to htl.
(__pthread_get_cleanup_stack): Make reference weak for skipping
registration on in the static non-libpthread case.
Diffstat (limited to 'sysdeps/htl/libc-lockP.h')
-rw-r--r--sysdeps/htl/libc-lockP.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/sysdeps/htl/libc-lockP.h b/sysdeps/htl/libc-lockP.h
index 4ba3930a13..0c887d707e 100644
--- a/sysdeps/htl/libc-lockP.h
+++ b/sysdeps/htl/libc-lockP.h
@@ -19,6 +19,7 @@
 #ifndef _BITS_LIBC_LOCKP_H
 #define _BITS_LIBC_LOCKP_H 1
 
+#include <libc-lock.h>
 #include <pthread.h>
 #include <pthread-functions.h>
 
@@ -73,6 +74,36 @@ typedef pthread_key_t __libc_key_t;
   __libc_ptf_call (__pthread_setspecific, (KEY, VALUE), 0)
 
 
+#undef __libc_cleanup_region_start
+#undef __libc_cleanup_region_end
+#undef __libc_cleanup_end
+
+#define __libc_cleanup_region_start(DOIT, FCT, ARG) \
+  {									      \
+    struct __pthread_cancelation_handler **__handlers = NULL;		      \
+    struct __pthread_cancelation_handler __handler;			      \
+    int _ditit = 0;							      \
+    if (DOIT && __pthread_get_cleanup_stack != NULL)			      \
+      {									      \
+	__handlers = __pthread_get_cleanup_stack ();			      \
+	__handler.__handler = FCT;					      \
+	__handler.__arg = ARG;						      \
+	__handler.__next = *__handlers;					      \
+	*__handlers = &__handler;					      \
+	_ditit = 1;							      \
+      }
+
+#define __libc_cleanup_end(DOIT) \
+    if (_ditit) {							      \
+      if (DOIT)								      \
+	__handler.__handler (__handler.__arg);				      \
+      *__handlers = __handler.__next;					      \
+    }
+
+#define __libc_cleanup_region_end(DOIT) \
+    __libc_cleanup_end(DOIT)						      \
+  }
+
 /* Functions that are used by this file and are internal to the GNU C
    library.  */
 
@@ -154,6 +185,7 @@ weak_extern (__pthread_once)
 weak_extern (__pthread_initialize)
 weak_extern (__pthread_atfork)
 weak_extern (__pthread_setcancelstate)
+weak_extern (__pthread_get_cleanup_stack)
 # else
 #  pragma weak __pthread_mutex_init
 #  pragma weak __pthread_mutex_destroy
@@ -176,6 +208,7 @@ weak_extern (__pthread_setcancelstate)
 #  pragma weak __pthread_initialize
 #  pragma weak __pthread_atfork
 #  pragma weak __pthread_setcancelstate
+#  pragma weak __pthread_get_cleanup_stack
 # endif
 #endif