summaryrefslogtreecommitdiff
path: root/proc.c
diff options
context:
space:
mode:
authorrsc <rsc>2009-05-31 05:12:21 +0000
committerrsc <rsc>2009-05-31 05:12:21 +0000
commit34295f461a416e40bb76e67c568a761222dc6913 (patch)
tree656ee29b7df282b32953ec927291a68cc0ff2124 /proc.c
parent949e55902bb0c976f74b5217b82deac65ff8d781 (diff)
downloadxv6-labs-34295f461a416e40bb76e67c568a761222dc6913.tar.gz
xv6-labs-34295f461a416e40bb76e67c568a761222dc6913.tar.bz2
xv6-labs-34295f461a416e40bb76e67c568a761222dc6913.zip
group locks into structs they protect.
few naming nits.
Diffstat (limited to 'proc.c')
-rw-r--r--proc.c86
1 files changed, 42 insertions, 44 deletions
diff --git a/proc.c b/proc.c
index dd7d881..9ab4922 100644
--- a/proc.c
+++ b/proc.c
@@ -6,9 +6,11 @@
#include "proc.h"
#include "spinlock.h"
-struct spinlock proc_table_lock;
+struct {
+ struct spinlock lock;
+ struct proc proc[NPROC];
+} ptable;
-struct proc proc[NPROC];
static struct proc *initproc;
int nextpid = 1;
@@ -18,7 +20,7 @@ extern void forkret1(struct trapframe*);
void
pinit(void)
{
- initlock(&proc_table_lock, "proc_table");
+ initlock(&ptable.lock, "ptable");
}
// Look in the process table for an UNUSED proc.
@@ -30,20 +32,19 @@ allocproc(void)
int i;
struct proc *p;
- acquire(&proc_table_lock);
- for(i = 0; i < NPROC; i++){
- p = &proc[i];
+ acquire(&ptable.lock);
+ for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
if(p->state == UNUSED){
p->state = EMBRYO;
p->pid = nextpid++;
goto found;
}
}
- release(&proc_table_lock);
+ release(&ptable.lock);
return 0;
found:
- release(&proc_table_lock);
+ release(&ptable.lock);
// Allocate kernel stack if necessary.
if((p->kstack = kalloc(KSTACKSIZE)) == 0){
@@ -215,14 +216,13 @@ scheduler(void)
sti();
// Loop over process table looking for process to run.
- acquire(&proc_table_lock);
- for(i = 0; i < NPROC; i++){
- p = &proc[i];
+ acquire(&ptable.lock);
+ for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
if(p->state != RUNNABLE)
continue;
// Switch to chosen process. It is the process's job
- // to release proc_table_lock and then reacquire it
+ // to release ptable.lock and then reacquire it
// before jumping back to us.
cp = p;
usegment();
@@ -234,12 +234,12 @@ scheduler(void)
cp = 0;
usegment();
}
- release(&proc_table_lock);
+ release(&ptable.lock);
}
}
-// Enter scheduler. Must already hold proc_table_lock
+// Enter scheduler. Must already hold ptable.lock
// and have changed cp->state.
void
sched(void)
@@ -250,8 +250,8 @@ sched(void)
panic("sched interruptible");
if(cp->state == RUNNING)
panic("sched running");
- if(!holding(&proc_table_lock))
- panic("sched proc_table_lock");
+ if(!holding(&ptable.lock))
+ panic("sched ptable.lock");
if(c->ncli != 1)
panic("sched locks");
@@ -264,10 +264,10 @@ sched(void)
void
yield(void)
{
- acquire(&proc_table_lock);
+ acquire(&ptable.lock);
cp->state = RUNNABLE;
sched();
- release(&proc_table_lock);
+ release(&ptable.lock);
}
// A fork child's very first scheduling by scheduler()
@@ -275,8 +275,8 @@ yield(void)
void
forkret(void)
{
- // Still holding proc_table_lock from scheduler.
- release(&proc_table_lock);
+ // Still holding ptable.lock from scheduler.
+ release(&ptable.lock);
// Jump into assembly, never to return.
forkret1(cp->tf);
@@ -293,14 +293,14 @@ sleep(void *chan, struct spinlock *lk)
if(lk == 0)
panic("sleep without lk");
- // Must acquire proc_table_lock in order to
+ // Must acquire ptable.lock in order to
// change p->state and then call sched.
- // Once we hold proc_table_lock, we can be
+ // Once we hold ptable.lock, we can be
// guaranteed that we won't miss any wakeup
- // (wakeup runs with proc_table_lock locked),
+ // (wakeup runs with ptable.lock locked),
// so it's okay to release lk.
- if(lk != &proc_table_lock){
- acquire(&proc_table_lock);
+ if(lk != &ptable.lock){
+ acquire(&ptable.lock);
release(lk);
}
@@ -313,15 +313,15 @@ sleep(void *chan, struct spinlock *lk)
cp->chan = 0;
// Reacquire original lock.
- if(lk != &proc_table_lock){
- release(&proc_table_lock);
+ if(lk != &ptable.lock){
+ release(&ptable.lock);
acquire(lk);
}
}
//PAGEBREAK!
// Wake up all processes sleeping on chan.
-// Proc_table_lock must be held.
+// The ptable lock must be held.
static void
wakeup1(void *chan)
{
@@ -336,9 +336,9 @@ wakeup1(void *chan)
void
wakeup(void *chan)
{
- acquire(&proc_table_lock);
+ acquire(&ptable.lock);
wakeup1(chan);
- release(&proc_table_lock);
+ release(&ptable.lock);
}
// Kill the process with the given pid.
@@ -349,18 +349,18 @@ kill(int pid)
{
struct proc *p;
- acquire(&proc_table_lock);
- for(p = proc; p < &proc[NPROC]; p++){
+ acquire(&ptable.lock);
+ for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
if(p->pid == pid){
p->killed = 1;
// Wake process from sleep if necessary.
if(p->state == SLEEPING)
p->state = RUNNABLE;
- release(&proc_table_lock);
+ release(&ptable.lock);
return 0;
}
}
- release(&proc_table_lock);
+ release(&ptable.lock);
return -1;
}
@@ -387,13 +387,13 @@ exit(void)
iput(cp->cwd);
cp->cwd = 0;
- acquire(&proc_table_lock);
+ acquire(&ptable.lock);
// Parent might be sleeping in wait().
wakeup1(cp->parent);
// Pass abandoned children to init.
- for(p = proc; p < &proc[NPROC]; p++){
+ for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
if(p->parent == cp){
p->parent = initproc;
if(p->state == ZOMBIE)
@@ -416,12 +416,11 @@ wait(void)
struct proc *p;
int i, havekids, pid;
- acquire(&proc_table_lock);
+ acquire(&ptable.lock);
for(;;){
// Scan through table looking for zombie children.
havekids = 0;
- for(i = 0; i < NPROC; i++){
- p = &proc[i];
+ for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
if(p->state == UNUSED)
continue;
if(p->parent == cp){
@@ -435,7 +434,7 @@ wait(void)
p->pid = 0;
p->parent = 0;
p->name[0] = 0;
- release(&proc_table_lock);
+ release(&ptable.lock);
return pid;
}
}
@@ -443,12 +442,12 @@ wait(void)
// No point waiting if we don't have any children.
if(!havekids || cp->killed){
- release(&proc_table_lock);
+ release(&ptable.lock);
return -1;
}
// Wait for children to exit. (See wakeup1 call in proc_exit.)
- sleep(cp, &proc_table_lock);
+ sleep(cp, &ptable.lock);
}
}
@@ -471,8 +470,7 @@ procdump(void)
char *state;
uint pc[10];
- for(i = 0; i < NPROC; i++){
- p = &proc[i];
+ for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
if(p->state == UNUSED)
continue;
if(p->state >= 0 && p->state < NELEM(states) && states[p->state])