summaryrefslogtreecommitdiffstats
path: root/lib/libpthread/uthread/uthread_kern.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libpthread/uthread/uthread_kern.c')
-rw-r--r--lib/libpthread/uthread/uthread_kern.c36
1 files changed, 21 insertions, 15 deletions
diff --git a/lib/libpthread/uthread/uthread_kern.c b/lib/libpthread/uthread/uthread_kern.c
index 7522b57b33b..d9a6108397b 100644
--- a/lib/libpthread/uthread/uthread_kern.c
+++ b/lib/libpthread/uthread/uthread_kern.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uthread_kern.c,v 1.16 2001/09/04 22:17:45 fgsch Exp $ */
+/* $OpenBSD: uthread_kern.c,v 1.17 2001/12/08 14:51:36 fgsch Exp $ */
/*
* Copyright (c) 1995-1998 John Birrell <jb@cimlogic.com.au>
* All rights reserved.
@@ -60,18 +60,6 @@ dequeue_signals(void);
static inline void
thread_run_switch_hook(pthread_t thread_out, pthread_t thread_in);
-static void
-_thread_check_cancel()
-{
- if (!(_thread_run->flags & PTHREAD_FLAGS_CANCELPT) &&
- (_thread_run->canceltype == PTHREAD_CANCEL_ASYNCHRONOUS))
- /*
- * Check if an async-cancellable thread
- * has been cancelled.
- */
- _thread_cancellation_point();
-}
-
void
_thread_kern_sched(struct sigcontext * scp)
{
@@ -551,7 +539,13 @@ _thread_kern_sched(struct sigcontext * scp)
thread_run_switch_hook(_last_user_thread,
_thread_run);
}
- _thread_check_cancel();
+
+ if (((curthread->cancelflags &
+ PTHREAD_AT_CANCEL_POINT) == 0) &&
+ ((curthread->cancelflags &
+ PTHREAD_CANCEL_ASYNCHRONOUS) != 0))
+ pthread_testcancel();
+
_thread_sys_sigreturn(&_thread_run->saved_sigcontext);
} else {
/*
@@ -565,7 +559,11 @@ _thread_kern_sched(struct sigcontext * scp)
_thread_run);
}
- _thread_check_cancel();
+ if (((curthread->cancelflags &
+ PTHREAD_AT_CANCEL_POINT) == 0) &&
+ ((curthread->cancelflags &
+ PTHREAD_CANCEL_ASYNCHRONOUS) != 0))
+ pthread_testcancel();
return;
}
@@ -1064,6 +1062,14 @@ _thread_kern_sig_undefer(void)
curthread->sig_defer_count = 0;
}
+ /*
+ * Check for asynchronous cancellation before delivering any
+ * pending signals:
+ */
+ if (((curthread->cancelflags & PTHREAD_AT_CANCEL_POINT) == 0) &&
+ ((curthread->cancelflags & PTHREAD_CANCEL_ASYNCHRONOUS) != 0))
+ pthread_testcancel();
+
/* Yield the CPU if necessary: */
if (need_resched || curthread->yield_on_sig_undefer != 0) {
curthread->yield_on_sig_undefer = 0;