summaryrefslogtreecommitdiff
path: root/nptl/cleanup_defer.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-04-12 00:14:16 +0000
committerUlrich Drepper <drepper@redhat.com>2003-04-12 00:14:16 +0000
commit6efd481484e5d8d47b834fd034dc62f4c036d2cf (patch)
treec4bd9e169d534ceaf83f4b3f6b7f034e0e1cb379 /nptl/cleanup_defer.c
parent32b0da568de098fc2d62da7cf6a06ddbaba156d7 (diff)
Declare __pthread_unwind. Define __do_cancel to use it. Declare old cleanup handler installation functions.
Diffstat (limited to 'nptl/cleanup_defer.c')
-rw-r--r--nptl/cleanup_defer.c52
1 files changed, 23 insertions, 29 deletions
diff --git a/nptl/cleanup_defer.c b/nptl/cleanup_defer.c
index 7945a0ddbb..4c67813d4e 100644
--- a/nptl/cleanup_defer.c
+++ b/nptl/cleanup_defer.c
@@ -17,20 +17,20 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#include <stdlib.h>
#include "pthreadP.h"
void
-_pthread_cleanup_push_defer (buffer, routine, arg)
- struct _pthread_cleanup_buffer *buffer;
- void (*routine) (void *);
- void *arg;
+__cleanup_fct_attribute
+__pthread_register_cancel_defer (__pthread_unwind_buf_t *buf)
{
+ struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf;
struct pthread *self = THREAD_SELF;
- buffer->__routine = routine;
- buffer->__arg = arg;
- buffer->__prev = THREAD_GETMEM (self, cleanup);
+ /* Store old info. */
+ ibuf->priv.data.prev = THREAD_GETMEM (self, cleanup_jmp_buf);
+ ibuf->priv.data.cleanup = THREAD_GETMEM (self, cleanup);
int cancelhandling = THREAD_GETMEM (self, cancelhandling);
@@ -38,61 +38,55 @@ _pthread_cleanup_push_defer (buffer, routine, arg)
if (__builtin_expect (cancelhandling & CANCELTYPE_BITMASK, 0))
while (1)
{
- int newval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling,
+ int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling,
cancelhandling
& ~CANCELTYPE_BITMASK,
cancelhandling);
- if (__builtin_expect (newval == cancelhandling, 1))
+ if (__builtin_expect (curval == cancelhandling, 1))
/* Successfully replaced the value. */
break;
/* Prepare for the next round. */
- cancelhandling = newval;
+ cancelhandling = curval;
}
- buffer->__canceltype = (cancelhandling & CANCELTYPE_BITMASK
- ? PTHREAD_CANCEL_ASYNCHRONOUS
- : PTHREAD_CANCEL_DEFERRED);
+ ibuf->priv.data.canceltype = (cancelhandling & CANCELTYPE_BITMASK
+ ? PTHREAD_CANCEL_ASYNCHRONOUS
+ : PTHREAD_CANCEL_DEFERRED);
- THREAD_SETMEM (self, cleanup, buffer);
+ /* Store the new cleanup handler info. */
+ THREAD_SETMEM (self, cleanup_jmp_buf, buf);
}
-strong_alias (_pthread_cleanup_push_defer, __pthread_cleanup_push_defer)
void
-_pthread_cleanup_pop_restore (buffer, execute)
- struct _pthread_cleanup_buffer *buffer;
- int execute;
+__cleanup_fct_attribute
+__pthread_unregister_cancel_restore (__pthread_unwind_buf_t *buf)
{
struct pthread *self = THREAD_SELF;
+ struct pthread_unwind_buf *ibuf = (struct pthread_unwind_buf *) buf;
- THREAD_SETMEM (self, cleanup, buffer->__prev);
+ THREAD_SETMEM (self, cleanup_jmp_buf, ibuf->priv.data.prev);
int cancelhandling;
- if (__builtin_expect (buffer->__canceltype != PTHREAD_CANCEL_DEFERRED, 0)
+ if (ibuf->priv.data.canceltype != PTHREAD_CANCEL_DEFERRED
&& ((cancelhandling = THREAD_GETMEM (self, cancelhandling))
& CANCELTYPE_BITMASK) == 0)
{
while (1)
{
- int newval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling,
+ int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling,
cancelhandling
| CANCELTYPE_BITMASK,
cancelhandling);
- if (__builtin_expect (newval == cancelhandling, 1))
+ if (__builtin_expect (curval == cancelhandling, 1))
/* Successfully replaced the value. */
break;
/* Prepare for the next round. */
- cancelhandling = newval;
+ cancelhandling = curval;
}
CANCELLATION_P (self);
}
-
- /* If necessary call the cleanup routine after we removed the
- current cleanup block from the list. */
- if (execute)
- buffer->__routine (buffer->__arg);
}
-strong_alias (_pthread_cleanup_pop_restore, __pthread_cleanup_pop_restore)