diff options
| author | David Xu <davidxu@FreeBSD.org> | 2002-11-14 06:06:45 +0000 |
|---|---|---|
| committer | David Xu <davidxu@FreeBSD.org> | 2002-11-14 06:06:45 +0000 |
| commit | ca161eb6e938b6ab3f688ece75ce30bcd2c6f147 (patch) | |
| tree | a28878d82317bd91174b76450cccbee4a6859e3c /sys/kern | |
| parent | e3c29144fe299cf4b0d2c11b332b417757d8dd1f (diff) | |
Notes
Diffstat (limited to 'sys/kern')
| -rw-r--r-- | sys/kern/kern_kse.c | 20 | ||||
| -rw-r--r-- | sys/kern/kern_thread.c | 20 |
2 files changed, 32 insertions, 8 deletions
diff --git a/sys/kern/kern_kse.c b/sys/kern/kern_kse.c index 078a6e91cd55..93ead671c105 100644 --- a/sys/kern/kern_kse.c +++ b/sys/kern/kern_kse.c @@ -341,12 +341,24 @@ kse_release(struct thread *td, struct kse_release_args *uap) struct proc *p; p = td->td_proc; - /* KSE-enabled processes only, please. */ - if (p->p_flag & P_KSES) { + /* KSE-enabled processes only */ + if (!(p->p_flag & P_KSES)) + return (EINVAL); + /* + * Must be a bound thread. And kse must have a mailbox ready, + * if not, the kse would can not generate an upcall. + */ + if (!(td->td_flags & TDF_UNBOUND) && (td->td_kse->ke_mailbox != NULL)) { PROC_LOCK(p); mtx_lock_spin(&sched_lock); - thread_exit(); - /* NOTREACHED */ + /* prevent last thread from exiting */ + if (p->p_numthreads > 1) { + thread_exit(); + /* NOTREACHED */ + } else { + mtx_unlock_spin(&sched_lock); + PROC_UNLOCK(p); + } } return (EINVAL); } diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c index 078a6e91cd55..93ead671c105 100644 --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -341,12 +341,24 @@ kse_release(struct thread *td, struct kse_release_args *uap) struct proc *p; p = td->td_proc; - /* KSE-enabled processes only, please. */ - if (p->p_flag & P_KSES) { + /* KSE-enabled processes only */ + if (!(p->p_flag & P_KSES)) + return (EINVAL); + /* + * Must be a bound thread. And kse must have a mailbox ready, + * if not, the kse would can not generate an upcall. + */ + if (!(td->td_flags & TDF_UNBOUND) && (td->td_kse->ke_mailbox != NULL)) { PROC_LOCK(p); mtx_lock_spin(&sched_lock); - thread_exit(); - /* NOTREACHED */ + /* prevent last thread from exiting */ + if (p->p_numthreads > 1) { + thread_exit(); + /* NOTREACHED */ + } else { + mtx_unlock_spin(&sched_lock); + PROC_UNLOCK(p); + } } return (EINVAL); } |
