diff options
| author | Robert Morris <rtm@csail.mit.edu> | 2019-07-07 07:03:28 -0400 | 
|---|---|---|
| committer | Robert Morris <rtm@csail.mit.edu> | 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); | 
