aboutsummaryrefslogtreecommitdiff
path: root/nptl/pthreadP.h
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/pthreadP.h
parent32b0da568de098fc2d62da7cf6a06ddbaba156d7 (diff)
downloadglibc-6efd481484e5d8d47b834fd034dc62f4c036d2cf.zip
glibc-6efd481484e5d8d47b834fd034dc62f4c036d2cf.tar.gz
glibc-6efd481484e5d8d47b834fd034dc62f4c036d2cf.tar.bz2
Declare __pthread_unwind. Define __do_cancel to use it. Declare old cleanup handler installation functions.
Diffstat (limited to 'nptl/pthreadP.h')
-rw-r--r--nptl/pthreadP.h66
1 files changed, 33 insertions, 33 deletions
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h
index db345d5..d51f837 100644
--- a/nptl/pthreadP.h
+++ b/nptl/pthreadP.h
@@ -94,6 +94,29 @@ extern int __pthread_debug attribute_hidden;
} \
} while (0)
+
+extern void __pthread_unwind (__pthread_unwind_buf_t *__buf)
+ __cleanup_fct_attribute __attribute ((__noreturn__))
+#ifndef SHARED
+ weak_function
+#endif
+ ;
+
+/* Called when a thread reacts on a cancellation request. */
+static inline void
+__attribute ((noreturn))
+__do_cancel (void)
+{
+ struct pthread *self = THREAD_SELF;
+
+ /* Make sure we get no more cancellations. */
+ THREAD_ATOMIC_BIT_SET (self, cancelhandling, EXITING_BIT);
+
+ __pthread_unwind ((__pthread_unwind_buf_t *)
+ THREAD_GETMEM (self, cleanup_jmp_buf));
+}
+
+
/* Set cancellation mode to asynchronous. */
#define CANCEL_ASYNC() \
__pthread_enable_asynccancel ()
@@ -143,38 +166,6 @@ extern int __pthread_debug attribute_hidden;
#endif
-/* This function is responsible for calling all registered cleanup
- handlers and then terminate the thread. This includes dellocating
- the thread-specific data. The implementation is complicated by the
- fact that we have to handle to cancellation handler registration
- methods: exceptions using try/finally and setjmp.
-
- The setjmp method is always available. The user might compile some
- code which uses this method because no modern compiler is
- available. So we have to handle these first since we cannot call
- the cleanup handlers if the stack frames are gone. At the same
- time this opens a hole for the register exception handler blocks
- since now they might be in danger of using an overwritten stack
- frame. The advise is to only use new or only old style cancellation
- handling. */
-static inline void
-__do_cancel (void)
-{
- struct pthread *self = THREAD_SELF;
-
- /* Make sure we get no more cancellations. */
- THREAD_ATOMIC_BIT_SET (self, cancelhandling, EXITING_BIT);
-
- /* Throw an exception. */
- // XXX TBI
-
- /* If throwing an exception didn't work try the longjmp. */
- __libc_longjmp (self->cancelbuf, 1);
-
- /* NOTREACHED */
-}
-
-
/* Internal prototypes. */
/* Thread list handling. */
@@ -344,7 +335,6 @@ extern int __pthread_cond_wait_2_0 (pthread_cond_2_0_t *cond,
pthread_mutex_t *mutex);
-
/* The two functions are in libc.so and not exported. */
extern int __libc_enable_asynccancel (void) attribute_hidden;
extern void __libc_disable_asynccancel (int oldtype)
@@ -372,4 +362,14 @@ extern void __pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer
extern void __pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer,
int execute);
+/* Old cleanup interfaces, still used in libc.so. */
+extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
+ void (*routine) (void *), void *arg);
+extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer,
+ int execute);
+extern void _pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer,
+ void (*routine) (void *), void *arg);
+extern void _pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer,
+ int execute);
+
#endif /* pthreadP.h */