diff --git a/Makefile b/Makefile index b4fd9a253c..40885e47ce 100644 --- a/Makefile +++ b/Makefile @@ -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'' diff --git a/proc.c b/proc.c index b6dd11f06b..85f3f1755d 100644 --- a/proc.c +++ b/proc.c @@ -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){ @@ -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) @@ -100,6 +100,8 @@ userinit(void) p->cwd = namei("/"); p->state = RUNNABLE; + + release(&ptable.lock); } // Grow current process's memory by n bytes. @@ -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; @@ -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; @@ -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; }