Skip to content

Commit

Permalink
hold ptable.lock for the entire process creation
Browse files Browse the repository at this point in the history
however, processes still modify their own p->* without locking
  • Loading branch information
Robert Morris committed Aug 13, 2016
1 parent 20d05d4 commit 19f6541
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 9 deletions.
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,8 @@ AS = $(TOOLPREFIX)gas
LD = $(TOOLPREFIX)ld
OBJCOPY = $(TOOLPREFIX)objcopy
OBJDUMP = $(TOOLPREFIX)objdump
#CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer
CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -MD -gdwarf-2 -m32 -Werror -fno-omit-frame-pointer
CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer
#CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -MD -gdwarf-2 -m32 -Werror -fno-omit-frame-pointer
CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)
ASFLAGS = -m32 -gdwarf-2 -Wa,-divide
# FreeBSD ld wants ``elf_i386_fbsd''
Expand Down
20 changes: 13 additions & 7 deletions proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,23 +31,21 @@ 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){
Expand Down Expand Up @@ -81,6 +79,8 @@ userinit(void)
struct proc *p;
extern char _binary_initcode_start[], _binary_initcode_size[];

acquire(&ptable.lock);

p = allocproc();
initproc = p;
if((p->pgdir = setupkvm()) == 0)
Expand All @@ -100,6 +100,8 @@ userinit(void)
p->cwd = namei("/");

p->state = RUNNABLE;

release(&ptable.lock);
}

// Grow current process's memory by n bytes.
Expand Down Expand Up @@ -131,15 +133,20 @@ fork(void)
int i, pid;
struct proc *np;

acquire(&ptable.lock);

// Allocate process.
if((np = allocproc()) == 0)
if((np = allocproc()) == 0){
release(&ptable.lock);
return -1;
}

// 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;
Expand All @@ -158,9 +165,8 @@ fork(void)

pid = np->pid;

// lock to force the compiler to emit the np->state write last.
acquire(&ptable.lock);
np->state = RUNNABLE;

release(&ptable.lock);

return pid;
Expand Down Expand Up @@ -233,11 +239,11 @@ wait(void)
kfree(p->kstack);
p->kstack = 0;
freevm(p->pgdir);
p->state = UNUSED;
p->pid = 0;
p->parent = 0;
p->name[0] = 0;
p->killed = 0;
p->state = UNUSED;
release(&ptable.lock);
return pid;
}
Expand Down

0 comments on commit 19f6541

Please sign in to comment.