avoid a double-lock of initproc->lock if child of init is reparenting
This commit is contained in:
parent
7114bf43ed
commit
c4f6a241cd
1 changed files with 5 additions and 2 deletions
|
@ -292,6 +292,7 @@ fork(void)
|
||||||
// are locked.
|
// are locked.
|
||||||
void reparent(struct proc *p, struct proc *parent) {
|
void reparent(struct proc *p, struct proc *parent) {
|
||||||
struct proc *pp;
|
struct proc *pp;
|
||||||
|
int init_is_my_parent = (p->parent == initproc);
|
||||||
|
|
||||||
for(pp = ptable.proc; pp < &ptable.proc[NPROC]; pp++){
|
for(pp = ptable.proc; pp < &ptable.proc[NPROC]; pp++){
|
||||||
if (pp != p && pp != parent) {
|
if (pp != p && pp != parent) {
|
||||||
|
@ -299,9 +300,11 @@ void reparent(struct proc *p, struct proc *parent) {
|
||||||
if(pp->parent == p){
|
if(pp->parent == p){
|
||||||
pp->parent = initproc;
|
pp->parent = initproc;
|
||||||
if(pp->state == ZOMBIE) {
|
if(pp->state == ZOMBIE) {
|
||||||
acquire(&initproc->lock);
|
if(!init_is_my_parent)
|
||||||
|
acquire(&initproc->lock);
|
||||||
wakeup1(initproc);
|
wakeup1(initproc);
|
||||||
release(&initproc->lock);
|
if(!init_is_my_parent)
|
||||||
|
release(&initproc->lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
release(&pp->lock);
|
release(&pp->lock);
|
||||||
|
|
Loading…
Reference in a new issue