- Call fork1() directly instead of calling rfork() so that it doesn't mask
out RFSTOPPED. - Lock the child process when settings p_sigparent instead of locking the parent. Pointy-hat to: me
This commit is contained in:
parent
096f4f1395
commit
b3ef374c76
@ -122,7 +122,6 @@ linux_clone(struct proc *p, struct linux_clone_args *args)
|
|||||||
struct proc *p2;
|
struct proc *p2;
|
||||||
int exit_signal;
|
int exit_signal;
|
||||||
vm_offset_t start;
|
vm_offset_t start;
|
||||||
struct rfork_args rf_args;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (ldebug(clone)) {
|
if (ldebug(clone)) {
|
||||||
@ -156,17 +155,12 @@ linux_clone(struct proc *p, struct linux_clone_args *args)
|
|||||||
error = 0;
|
error = 0;
|
||||||
start = 0;
|
start = 0;
|
||||||
|
|
||||||
rf_args.flags = ff;
|
if ((error = fork1(p, ff, &p2)) != 0)
|
||||||
if ((error = rfork(p, &rf_args)) != 0)
|
|
||||||
return (error);
|
return (error);
|
||||||
|
|
||||||
p2 = pfind(p->p_retval[0]);
|
PROC_LOCK(p2);
|
||||||
if (p2 == NULL)
|
|
||||||
return (ESRCH);
|
|
||||||
|
|
||||||
PROC_LOCK(p);
|
|
||||||
p2->p_sigparent = exit_signal;
|
p2->p_sigparent = exit_signal;
|
||||||
PROC_UNLOCK(p);
|
PROC_UNLOCK(p2);
|
||||||
p2->p_addr->u_pcb.pcb_hw.apcb_usp = (unsigned long)args->stack;
|
p2->p_addr->u_pcb.pcb_hw.apcb_usp = (unsigned long)args->stack;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
@ -183,6 +177,8 @@ linux_clone(struct proc *p, struct linux_clone_args *args)
|
|||||||
setrunqueue(p2);
|
setrunqueue(p2);
|
||||||
mtx_unlock_spin(&sched_lock);
|
mtx_unlock_spin(&sched_lock);
|
||||||
|
|
||||||
|
p->p_retval[0] = p2->p_pid;
|
||||||
|
p->p_retval[1] = 0;
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user