提交 db4ad0cd 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

possible fixes

上级 be63c0b8
...@@ -239,11 +239,14 @@ fork(int flags) ...@@ -239,11 +239,14 @@ fork(int flags)
np->ofile[i] = filedup(proc->ofile[i]); np->ofile[i] = filedup(proc->ofile[i]);
np->cwd = idup(proc->cwd); np->cwd = idup(proc->cwd);
SLIST_INSERT_HEAD(&proc->childq, np, child_next); // XXX lock?
pid = np->pid; pid = np->pid;
addrun(np); addrun(np);
safestrcpy(np->name, proc->name, sizeof(proc->name)); safestrcpy(np->name, proc->name, sizeof(proc->name));
acquire(&proc->lock);
SLIST_INSERT_HEAD(&proc->childq, np, child_next);
release(&proc->lock);
return pid; return pid;
} }
...@@ -277,20 +280,23 @@ exit(void) ...@@ -277,20 +280,23 @@ exit(void)
acquire(&p->lock); acquire(&p->lock);
p->parent = initproc; p->parent = initproc;
if(p->state == ZOMBIE) if(p->state == ZOMBIE)
wakeupinit = 1; wakeupinit = 1;
SLIST_REMOVE(&proc->childq, p, proc, child_next); SLIST_REMOVE(&proc->childq, p, proc, child_next);
SLIST_INSERT_HEAD(&initproc->childq, p, child_next); // XXX lock?
release(&p->lock); release(&p->lock);
acquire(&initproc->lock);
SLIST_INSERT_HEAD(&initproc->childq, p, child_next);
release(&initproc->lock);
} }
// Parent might be sleeping in wait(). // Parent might be sleeping in wait().
acquire(&proc->lock);
cv_wakeup(&proc->parent->cv); cv_wakeup(&proc->parent->cv);
if (wakeupinit) if (wakeupinit)
cv_wakeup(&initproc->cv); cv_wakeup(&initproc->cv);
acquire(&proc->lock);
// Jump into the scheduler, never to return. // Jump into the scheduler, never to return.
proc->state = ZOMBIE; proc->state = ZOMBIE;
sched(); sched();
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论