diff options
Diffstat (limited to 'proc.c')
-rw-r--r-- | proc.c | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -7,7 +7,7 @@ #include "defs.h" #include "spinlock.h" -struct spinlock proc_table_lock = { "proc_table" }; +struct spinlock proc_table_lock; struct proc proc[NPROC]; struct proc *curproc[NCPU]; @@ -15,6 +15,12 @@ int next_pid = NCPU; extern void forkret(void); extern void forkret1(struct trapframe*); +void +pinit(void) +{ + initlock(&proc_table_lock, "proc_table"); +} + /* * set up a process's task state and segment descriptors * correctly, given its current size and address in memory. @@ -146,6 +152,9 @@ scheduler(void) // Loop over process table looking for process to run. acquire(&proc_table_lock); for(i = 0; i < NPROC; i++){ + if(cpus[cpu()].guard1 != 0xdeadbeef || + cpus[cpu()].guard2 != 0xdeadbeef) + panic("cpu guard"); p = &proc[i]; if(p->state != RUNNABLE) continue; @@ -194,6 +203,7 @@ scheduler(void) // XXX if not holding proc_table_lock panic. } + release(&proc_table_lock); if(cpus[cpu()].nlock != 0) @@ -212,7 +222,9 @@ scheduler(void) void sched(void) { - if(setjmp(&curproc[cpu()]->jmpbuf) == 0) + struct proc *p = curproc[cpu()]; + + if(setjmp(&p->jmpbuf) == 0) longjmp(&cpus[cpu()].jmpbuf); } |