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/kern_thread.c | |
| parent | e3c29144fe299cf4b0d2c11b332b417757d8dd1f (diff) | |
Notes
Diffstat (limited to 'sys/kern/kern_thread.c')
| -rw-r--r-- | sys/kern/kern_thread.c | 20 | 
1 files changed, 16 insertions, 4 deletions
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);  }  | 
