summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2016-09-15 12:12:05 -0400
committerRobert Morris <[email protected]>2016-09-15 12:12:05 -0400
commitaeaa308943a14acfaab00f0d9af8424d21a991ae (patch)
treef71e5f81df058e9a0b26aeb51782e6edf05c58d0
parent469aa8b9b3b719a9fd13bfe750751ccd878cb206 (diff)
downloadxv6-labs-aeaa308943a14acfaab00f0d9af8424d21a991ae.tar.gz
xv6-labs-aeaa308943a14acfaab00f0d9af8424d21a991ae.tar.bz2
xv6-labs-aeaa308943a14acfaab00f0d9af8424d21a991ae.zip
change allocproc() back to acquiring the ptable.lock.
fix bugs where caller incorrectly released lock on error return path.
-rw-r--r--proc.c20
1 files changed, 6 insertions, 14 deletions
diff --git a/proc.c b/proc.c
index eee79af..7d03ad7 100644
--- a/proc.c
+++ b/proc.c
@@ -31,22 +31,27 @@ pinit(void)
// If found, change state to EMBRYO and initialize
// state required to run in the kernel.
// Otherwise return 0.
-// Must hold ptable.lock.
static struct proc*
allocproc(void)
{
struct proc *p;
char *sp;
+ acquire(&ptable.lock);
+
for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
if(p->state == UNUSED)
goto found;
+
+ release(&ptable.lock);
return 0;
found:
p->state = EMBRYO;
p->pid = nextpid++;
+ release(&ptable.lock);
+
// Allocate kernel stack.
if((p->kstack = kalloc()) == 0){
p->state = UNUSED;
@@ -79,14 +84,7 @@ userinit(void)
struct proc *p;
extern char _binary_initcode_start[], _binary_initcode_size[];
- 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)
@@ -145,22 +143,16 @@ fork(void)
int i, pid;
struct proc *np;
- acquire(&ptable.lock);
-
// Allocate process.
if((np = allocproc()) == 0){
- release(&ptable.lock);
return -1;
}
- release(&ptable.lock);
-
// Copy process state from p.
if((np->pgdir = copyuvm(proc->pgdir, proc->sz)) == 0){
kfree(np->kstack);
np->kstack = 0;
np->state = UNUSED;
- release(&ptable.lock);
return -1;
}
np->sz = proc->sz;