diff options
author | Robert Morris <[email protected]> | 2019-07-07 07:03:28 -0400 |
---|---|---|
committer | Robert Morris <[email protected]> | 2019-07-07 07:03:28 -0400 |
commit | c4f6a241cdc220dafe01bc7ca2ca7f8a253a838c (patch) | |
tree | 07baf234e50f2222c224d154758e566bf30f47de /kernel | |
parent | 7114bf43ed4bfcfd5534a2aa722c2778501ae2b3 (diff) | |
download | xv6-labs-c4f6a241cdc220dafe01bc7ca2ca7f8a253a838c.tar.gz xv6-labs-c4f6a241cdc220dafe01bc7ca2ca7f8a253a838c.tar.bz2 xv6-labs-c4f6a241cdc220dafe01bc7ca2ca7f8a253a838c.zip |
avoid a double-lock of initproc->lock if child of init is reparenting
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/proc.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/kernel/proc.c b/kernel/proc.c index 2266ca6..cfb3262 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -292,6 +292,7 @@ fork(void) // are locked. void reparent(struct proc *p, struct proc *parent) { struct proc *pp; + int init_is_my_parent = (p->parent == initproc); for(pp = ptable.proc; pp < &ptable.proc[NPROC]; pp++){ if (pp != p && pp != parent) { @@ -299,9 +300,11 @@ void reparent(struct proc *p, struct proc *parent) { if(pp->parent == p){ pp->parent = initproc; if(pp->state == ZOMBIE) { - acquire(&initproc->lock); + if(!init_is_my_parent) + acquire(&initproc->lock); wakeup1(initproc); - release(&initproc->lock); + if(!init_is_my_parent) + release(&initproc->lock); } } release(&pp->lock); |