Update.
authorUlrich Drepper <drepper@redhat.com>
Wed, 2 Jul 2003 05:13:15 +0000 (05:13 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 2 Jul 2003 05:13:15 +0000 (05:13 +0000)
2003-07-01  Ulrich Drepper  <drepper@redhat.com>

* libc-cancellation.c (__libc_cleanup_routine): Define.
* sysdeps/pthread/bits/libc-lock.h (__pthread_cleanup_push): Define.
(__pthread_cleanup_pop): Define.

nptl/Banner
nptl/ChangeLog
nptl/libc-cancellation.c
nptl/sysdeps/pthread/bits/libc-lock.h

index c1d4625..00dde37 100644 (file)
@@ -1 +1 @@
-NPTL 0.50 by Ulrich Drepper
+NPTL 0.51 by Ulrich Drepper
index 4a976c4..82034f8 100644 (file)
@@ -1,3 +1,9 @@
+2003-07-01  Ulrich Drepper  <drepper@redhat.com>
+
+       * libc-cancellation.c (__libc_cleanup_routine): Define.
+       * sysdeps/pthread/bits/libc-lock.h (__pthread_cleanup_push): Define.
+       (__pthread_cleanup_pop): Define.
+
 2003-07-01  Richard Henderson  <rth@redhat.com>
 
        * sysdeps/alpha/elf/pt-initfini.c: New file.
index 72a6d10..a68ee71 100644 (file)
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include "pthreadP.h"
 #include "atomic.h"
+#include <bits/libc-lock.h>
 
 
 #ifndef NOT_IN_libc
@@ -103,4 +104,12 @@ __libc_disable_asynccancel (int oldtype)
     }
 }
 
+
+void
+__libc_cleanup_routine (struct __pthread_cleanup_frame *f)
+{
+  if (f->__do_it)
+    f->__cancel_routine (f->__cancel_arg);
+}
+
 #endif
index 945a81c..48c4e89 100644 (file)
@@ -389,6 +389,27 @@ extern void _pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer
     } else if (DOIT)                                                         \
       _buffer.__routine (_buffer.__arg)
 
+
+/* Normal cleanup handling, based on C cleanup attribute.  */
+extern inline void
+__libc_cleanup_routine (struct __pthread_cleanup_frame *f)
+{
+  if (f->__do_it)
+    f->__cancel_routine (f->__cancel_arg);
+}
+
+#define __pthread_cleanup_push(fct, arg) \
+  do {                                                                       \
+    struct __pthread_cleanup_frame __clframe                                 \
+      __attribute__ ((__cleanup__ (__libc_cleanup_routine)))                 \
+      = { .__cancel_routine = (routine), .__cancel_arg = (arg),                      \
+          .__do_it = 1 };
+
+#define __pthread_cleanup_pop(execute) \
+    __clframe.__do_it = (execute);                                           \
+  } while (0)
+
+
 /* Create thread-specific key.  */
 #define __libc_key_create(KEY, DESTRUCTOR) \
   __libc_ptf_call (__pthread_key_create, (KEY, DESTRUCTOR), 1)