diff options
| author | Frans Kaashoek <kaashoek@mit.edu> | 2016-09-08 21:20:26 -0400 | 
|---|---|---|
| committer | Frans Kaashoek <kaashoek@mit.edu> | 2016-09-08 21:20:26 -0400 | 
| commit | 551c2f3576d34e4749a1165af07d90e21ad528be (patch) | |
| tree | 7fac220585c88fcb568bc8c656e0532b033fec9b | |
| parent | 1b8ccf9482facb15f905a6baca4f5d800a13c542 (diff) | |
| parent | 34c2efc1d063f4b366c1017c174d117cc96eb990 (diff) | |
| download | xv6-labs-551c2f3576d34e4749a1165af07d90e21ad528be.tar.gz xv6-labs-551c2f3576d34e4749a1165af07d90e21ad528be.tar.bz2 xv6-labs-551c2f3576d34e4749a1165af07d90e21ad528be.zip | |
Merge branch 'master' of g.csail.mit.edu:xv6-dev
| -rw-r--r-- | proc.c | 18 | ||||
| -rw-r--r-- | spinlock.c | 6 | 
2 files changed, 21 insertions, 3 deletions
| @@ -82,6 +82,12 @@ userinit(void)    acquire(&ptable.lock);    p = allocproc(); + +  // release the lock in case namei() sleeps. +  // the lock isn't needed because no other +  // thread will look at an EMBRYO proc. +  release(&ptable.lock); +      initproc = p;    if((p->pgdir = setupkvm()) == 0)      panic("userinit: out of memory?"); @@ -99,6 +105,12 @@ userinit(void)    safestrcpy(p->name, "initcode", sizeof(p->name));    p->cwd = namei("/"); +  // this assignment to p->state lets other cores +  // run this process. the acquire forces the above +  // writes to be visible, and the lock is also needed +  // because the assignment might not be atomic. +  acquire(&ptable.lock); +    p->state = RUNNABLE;    release(&ptable.lock); @@ -141,6 +153,8 @@ fork(void)      return -1;    } +  release(&ptable.lock); +    // Copy process state from p.    if((np->pgdir = copyuvm(proc->pgdir, proc->sz)) == 0){      kfree(np->kstack); @@ -165,6 +179,8 @@ fork(void)    pid = np->pid; +  acquire(&ptable.lock); +    np->state = RUNNABLE;    release(&ptable.lock); @@ -227,7 +243,7 @@ wait(void)    acquire(&ptable.lock);    for(;;){ -    // Scan through table looking for zombie children. +    // Scan through table looking for exited children.      havekids = 0;      for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){        if(p->parent != proc) @@ -59,8 +59,10 @@ release(struct spinlock *lk)    // stores; __sync_synchronize() tells them both to not re-order.    __sync_synchronize(); -  // Release the lock. -  lk->locked = 0; +  // Release the lock, equivalent to lk->locked = 0. +  // This code can't use a C assignment, since it might +  // not be atomic. +  asm volatile("movl $0, %0" : "+m" (lk->locked) : );    popcli();  } | 
