Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/kern_exec.c
Show First 20 Lines • Show All 301 Lines • ▼ Show 20 Lines | pre_execve(struct thread *td, struct vmspace **oldvmspace) | ||||
struct proc *p; | struct proc *p; | ||||
int error; | int error; | ||||
KASSERT(td == curthread, ("non-current thread %p", td)); | KASSERT(td == curthread, ("non-current thread %p", td)); | ||||
error = 0; | error = 0; | ||||
p = td->td_proc; | p = td->td_proc; | ||||
if ((p->p_flag & P_HADTHREADS) != 0) { | if ((p->p_flag & P_HADTHREADS) != 0) { | ||||
PROC_LOCK(p); | PROC_LOCK(p); | ||||
while (p->p_singlethr > 0) { | |||||
error = msleep(&p->p_singlethr, &p->p_mtx, | |||||
PWAIT | PCATCH, "exec1t", 0); | |||||
if (error != 0) { | |||||
error = ERESTART; | |||||
goto unlock; | |||||
} | |||||
} | |||||
if (thread_single(p, SINGLE_BOUNDARY) != 0) | if (thread_single(p, SINGLE_BOUNDARY) != 0) | ||||
error = ERESTART; | error = ERESTART; | ||||
unlock: | |||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
} | } | ||||
KASSERT(error != 0 || (td->td_pflags & TDP_EXECVMSPC) == 0, | KASSERT(error != 0 || (td->td_pflags & TDP_EXECVMSPC) == 0, | ||||
("nested execve")); | ("nested execve")); | ||||
*oldvmspace = p->p_vmspace; | *oldvmspace = p->p_vmspace; | ||||
return (error); | return (error); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,727 Lines • Show Last 20 Lines |