diff options
author | davidxu <davidxu@FreeBSD.org> | 2002-11-17 10:12:00 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2002-11-17 10:12:00 +0000 |
commit | 2e6e4a9c2a577bb3ef91a5e4beb65c499ad40dcf (patch) | |
tree | 7c4623e75cf5e25ee1eef48023ea5eec0b6d18e6 /sys/kern/kern_kse.c | |
parent | 8275a804035e2f946f6f06de452a71251e64d983 (diff) | |
download | FreeBSD-src-2e6e4a9c2a577bb3ef91a5e4beb65c499ad40dcf.zip FreeBSD-src-2e6e4a9c2a577bb3ef91a5e4beb65c499ad40dcf.tar.gz |
Rework last exiting thread in kse_release(), wait a signal and then
schedule an upcall and call thread_exit().
Diffstat (limited to 'sys/kern/kern_kse.c')
-rw-r--r-- | sys/kern/kern_kse.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/kern/kern_kse.c b/sys/kern/kern_kse.c index 6bcd1b2..d4e74f0 100644 --- a/sys/kern/kern_kse.c +++ b/sys/kern/kern_kse.c @@ -357,8 +357,17 @@ kse_release(struct thread *td, struct kse_release_args *uap) /* NOTREACHED */ } else { mtx_unlock_spin(&sched_lock); - PROC_UNLOCK(p); - return EWOULDBLOCK; + if (td->td_standin == NULL) { + PROC_UNLOCK(p); + td->td_standin = thread_alloc(); + PROC_LOCK(p); + } + msleep(p->p_sigacts, &p->p_mtx, PPAUSE|PCATCH, + "pause", 0); + mtx_lock_spin(&sched_lock); + td->td_flags &= ~TDF_UNBOUND; + thread_schedule_upcall(td, td->td_kse); + thread_exit(); } } return (EINVAL); |