summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Leonard <d@cvs.openbsd.org>2001-01-16 04:51:08 +0000
committerDavid Leonard <d@cvs.openbsd.org>2001-01-16 04:51:08 +0000
commit16c719bebc6ea3163d9ddf789b350b1a6cac9083 (patch)
tree54112e3126cd3e976c545a8b76a3c29117858df6
parentda3003997b9a0c3df80328dcd2226083baed6489 (diff)
switch stacks even when restoring a preempted thread. (credit to pefo@)
-rw-r--r--lib/libc_r/uthread/uthread_kern.c20
-rw-r--r--lib/libpthread/uthread/uthread_kern.c20
2 files changed, 16 insertions, 24 deletions
diff --git a/lib/libc_r/uthread/uthread_kern.c b/lib/libc_r/uthread/uthread_kern.c
index 716c64f63cb..7b723ba8ddd 100644
--- a/lib/libc_r/uthread/uthread_kern.c
+++ b/lib/libc_r/uthread/uthread_kern.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uthread_kern.c,v 1.10 2000/10/04 05:55:35 d Exp $ */
+/* $OpenBSD: uthread_kern.c,v 1.11 2001/01/16 04:51:07 d Exp $ */
/*
* Copyright (c) 1995-1998 John Birrell <jb@cimlogic.com.au>
* All rights reserved.
@@ -520,6 +520,12 @@ _thread_kern_sched(struct sigcontext * scp)
/* Restore errno. */
errno = _thread_run->error;
+ /*
+ * Restore the new thread, saving current.
+ */
+ _thread_machdep_switch(&_thread_run->_machdep,
+ &old_thread_run->_machdep);
+
/* Check if a signal context was saved: */
if (_thread_run->sig_saved == 1) {
/*
@@ -542,6 +548,7 @@ _thread_kern_sched(struct sigcontext * scp)
thread_run_switch_hook(_last_user_thread,
_thread_run);
}
+ _thread_check_cancel();
_thread_sys_sigreturn(&_thread_run->saved_sigcontext);
} else {
/*
@@ -556,18 +563,7 @@ _thread_kern_sched(struct sigcontext * scp)
}
_thread_check_cancel();
-
- /*
- * Resume thread _thread_run.
- */
- _thread_machdep_switch(&_thread_run->_machdep,
- &old_thread_run->_machdep);
- /*
- * This thread is now the new _thread_run
- * again.
- */
return;
-
}
/* This point should not be reached. */
diff --git a/lib/libpthread/uthread/uthread_kern.c b/lib/libpthread/uthread/uthread_kern.c
index 716c64f63cb..7b723ba8ddd 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.10 2000/10/04 05:55:35 d Exp $ */
+/* $OpenBSD: uthread_kern.c,v 1.11 2001/01/16 04:51:07 d Exp $ */
/*
* Copyright (c) 1995-1998 John Birrell <jb@cimlogic.com.au>
* All rights reserved.
@@ -520,6 +520,12 @@ _thread_kern_sched(struct sigcontext * scp)
/* Restore errno. */
errno = _thread_run->error;
+ /*
+ * Restore the new thread, saving current.
+ */
+ _thread_machdep_switch(&_thread_run->_machdep,
+ &old_thread_run->_machdep);
+
/* Check if a signal context was saved: */
if (_thread_run->sig_saved == 1) {
/*
@@ -542,6 +548,7 @@ _thread_kern_sched(struct sigcontext * scp)
thread_run_switch_hook(_last_user_thread,
_thread_run);
}
+ _thread_check_cancel();
_thread_sys_sigreturn(&_thread_run->saved_sigcontext);
} else {
/*
@@ -556,18 +563,7 @@ _thread_kern_sched(struct sigcontext * scp)
}
_thread_check_cancel();
-
- /*
- * Resume thread _thread_run.
- */
- _thread_machdep_switch(&_thread_run->_machdep,
- &old_thread_run->_machdep);
- /*
- * This thread is now the new _thread_run
- * again.
- */
return;
-
}
/* This point should not be reached. */