Wrap proc state setting and getting with functions

上级 693cfef8
...@@ -38,7 +38,7 @@ struct proc { ...@@ -38,7 +38,7 @@ struct proc {
struct vmap *vmap; // va -> vma struct vmap *vmap; // va -> vma
uptr brk; // Top of heap uptr brk; // Top of heap
char *kstack; // Bottom of kernel stack for this process char *kstack; // Bottom of kernel stack for this process
enum procstate state; // Process state enum procstate _state; // Process state
volatile int pid; // Process ID volatile int pid; // Process ID
struct proc *parent; // Parent process struct proc *parent; // Parent process
struct trapframe *tf; // Trap frame for current syscall struct trapframe *tf; // Trap frame for current syscall
...@@ -72,3 +72,16 @@ struct proc { ...@@ -72,3 +72,16 @@ struct proc {
LIST_ENTRY(proc) cv_waiters; // Linked list of processes waiting for oncv LIST_ENTRY(proc) cv_waiters; // Linked list of processes waiting for oncv
LIST_ENTRY(proc) cv_sleep; // Linked list of processes sleeping on a cv LIST_ENTRY(proc) cv_sleep; // Linked list of processes sleeping on a cv
}; };
static inline void
set_proc_state(struct proc *p, enum procstate s)
{
p->_state = s;
}
static inline enum procstate
get_proc_state(struct proc *p)
{
return p->_state;
}
...@@ -82,7 +82,7 @@ void cv_sleepto(struct condvar *cv, struct spinlock *lk, u64 timeout) ...@@ -82,7 +82,7 @@ void cv_sleepto(struct condvar *cv, struct spinlock *lk, u64 timeout)
LIST_INSERT_HEAD(&cv->waiters, myproc(), cv_waiters); LIST_INSERT_HEAD(&cv->waiters, myproc(), cv_waiters);
myproc()->oncv = cv; myproc()->oncv = cv;
myproc()->state = SLEEPING; set_proc_state(myproc(), SLEEPING);
if (timeout) { if (timeout) {
acquire(&sleepers_lock); acquire(&sleepers_lock);
...@@ -115,9 +115,9 @@ cv_wakeup(struct condvar *cv) ...@@ -115,9 +115,9 @@ cv_wakeup(struct condvar *cv)
acquire(&cv->lock); acquire(&cv->lock);
LIST_FOREACH_SAFE(p, &cv->waiters, cv_waiters, tmp) { LIST_FOREACH_SAFE(p, &cv->waiters, cv_waiters, tmp) {
acquire(&p->lock); acquire(&p->lock);
if (p->state != SLEEPING) if (get_proc_state(p) != SLEEPING)
panic("cv_wakeup: pid %u name %s state %u", panic("cv_wakeup: pid %u name %s state %u",
p->pid, p->name, p->state); p->pid, p->name, get_proc_state(p));
if (p->oncv != cv) if (p->oncv != cv)
panic("cv_wakeup: pid %u name %s p->cv %p cv %p", panic("cv_wakeup: pid %u name %s p->cv %p cv %p",
p->pid, p->name, p->oncv, cv); p->pid, p->name, p->oncv, cv);
......
...@@ -38,7 +38,7 @@ idleloop(void) ...@@ -38,7 +38,7 @@ idleloop(void)
struct proc *p = schednext(); struct proc *p = schednext();
if (p) { if (p) {
acquire(&p->lock); acquire(&p->lock);
if (p->state != RUNNABLE) { if (get_proc_state(p) != RUNNABLE) {
panic("Huh?"); panic("Huh?");
release(&p->lock); release(&p->lock);
} else { } else {
...@@ -50,7 +50,7 @@ idleloop(void) ...@@ -50,7 +50,7 @@ idleloop(void)
// before jumping back to us. // before jumping back to us.
mycpu()->proc = p; mycpu()->proc = p;
switchuvm(p); switchuvm(p);
p->state = RUNNING; set_proc_state(p, RUNNING);
p->tsc = rdtsc(); p->tsc = rdtsc();
mtpause(idlep); mtpause(idlep);
...@@ -69,7 +69,7 @@ idleloop(void) ...@@ -69,7 +69,7 @@ idleloop(void)
// Process is done running for now. // Process is done running for now.
// It should have changed its p->state before coming back. // It should have changed its p->state before coming back.
mycpu()->proc = idlep; mycpu()->proc = idlep;
if (p->state == RUNNABLE) if (get_proc_state(p) == RUNNABLE)
addrun(p); addrun(p);
release(&p->lock); release(&p->lock);
} }
......
...@@ -41,13 +41,13 @@ sched(void) ...@@ -41,13 +41,13 @@ sched(void)
#endif #endif
if(mycpu()->ncli != 1) if(mycpu()->ncli != 1)
panic("sched locks"); panic("sched locks");
if(myproc()->state == RUNNING) if(get_proc_state(myproc()) == RUNNING)
panic("sched running"); panic("sched running");
if(readrflags()&FL_IF) if(readrflags()&FL_IF)
panic("sched interruptible"); panic("sched interruptible");
intena = mycpu()->intena; intena = mycpu()->intena;
myproc()->curcycles += rdtsc() - myproc()->tsc; myproc()->curcycles += rdtsc() - myproc()->tsc;
if (myproc()->state == ZOMBIE) if (get_proc_state(myproc()) == ZOMBIE)
mtstop(myproc()); mtstop(myproc());
else else
mtpause(myproc()); mtpause(myproc());
...@@ -62,7 +62,7 @@ void ...@@ -62,7 +62,7 @@ void
yield(void) yield(void)
{ {
acquire(&myproc()->lock); //DOC: yieldlock acquire(&myproc()->lock); //DOC: yieldlock
myproc()->state = RUNNABLE; set_proc_state(myproc(), RUNNABLE);
sched(); sched();
release(&myproc()->lock); release(&myproc()->lock);
} }
...@@ -120,7 +120,7 @@ exit(void) ...@@ -120,7 +120,7 @@ exit(void)
SLIST_FOREACH_SAFE(p, &(myproc()->childq), child_next, np) { SLIST_FOREACH_SAFE(p, &(myproc()->childq), child_next, np) {
acquire(&p->lock); acquire(&p->lock);
p->parent = bootproc; p->parent = bootproc;
if(p->state == ZOMBIE) if(get_proc_state(p) == ZOMBIE)
wakeupinit = 1; wakeupinit = 1;
SLIST_REMOVE(&(myproc()->childq), p, proc, child_next); SLIST_REMOVE(&(myproc()->childq), p, proc, child_next);
release(&p->lock); release(&p->lock);
...@@ -139,7 +139,7 @@ exit(void) ...@@ -139,7 +139,7 @@ exit(void)
cv_wakeup(&bootproc->cv); cv_wakeup(&bootproc->cv);
// Jump into the scheduler, never to return. // Jump into the scheduler, never to return.
myproc()->state = ZOMBIE; set_proc_state(myproc(), ZOMBIE);
sched(); sched();
panic("zombie exit"); panic("zombie exit");
} }
...@@ -179,7 +179,7 @@ allocproc(void) ...@@ -179,7 +179,7 @@ allocproc(void)
if (p == 0) return 0; if (p == 0) return 0;
memset(p, 0, sizeof(*p)); memset(p, 0, sizeof(*p));
p->state = EMBRYO; set_proc_state(p, EMBRYO);
p->pid = xnspid->allockey(); p->pid = xnspid->allockey();
p->cpuid = mycpu()->id; p->cpuid = mycpu()->id;
p->on_runq = -1; p->on_runq = -1;
...@@ -353,7 +353,7 @@ kill(int pid) ...@@ -353,7 +353,7 @@ kill(int pid)
} }
acquire(&p->lock); acquire(&p->lock);
p->killed = 1; p->killed = 1;
if(p->state == SLEEPING){ if(get_proc_state(p) == SLEEPING){
// XXX // XXX
// we need to wake p up if it is cv_sleep()ing. // we need to wake p up if it is cv_sleep()ing.
// can't change p from SLEEPING to RUNNABLE since that // can't change p from SLEEPING to RUNNABLE since that
...@@ -388,8 +388,9 @@ procdumpall(void) ...@@ -388,8 +388,9 @@ procdumpall(void)
uptr pc[10]; uptr pc[10];
for (proc *p : xnspid) { for (proc *p : xnspid) {
if(p->state >= 0 && p->state < NELEM(states) && states[p->state]) if(get_proc_state(p) >= 0 && get_proc_state(p) < NELEM(states) &&
state = states[p->state]; states[get_proc_state(p)])
state = states[get_proc_state(p)];
else else
state = "???"; state = "???";
...@@ -399,7 +400,7 @@ procdumpall(void) ...@@ -399,7 +400,7 @@ procdumpall(void)
cprintf("\n%-3d %-10s %8s %2u %lu\n", cprintf("\n%-3d %-10s %8s %2u %lu\n",
p->pid, name, state, p->cpuid, p->tsc); p->pid, name, state, p->cpuid, p->tsc);
if(p->state == SLEEPING){ if(get_proc_state(p) == SLEEPING){
getcallerpcs((void*)p->context->rbp, pc, NELEM(pc)); getcallerpcs((void*)p->context->rbp, pc, NELEM(pc));
for(int i=0; i<10 && pc[i] != 0; i++) for(int i=0; i<10 && pc[i] != 0; i++)
cprintf(" %lx\n", pc[i]); cprintf(" %lx\n", pc[i]);
...@@ -428,7 +429,7 @@ fork(int flags) ...@@ -428,7 +429,7 @@ fork(int flags)
if((np->vmap = myproc()->vmap->copy(cow)) == 0){ if((np->vmap = myproc()->vmap->copy(cow)) == 0){
ksfree(slab_stack, np->kstack); ksfree(slab_stack, np->kstack);
np->kstack = 0; np->kstack = 0;
np->state = UNUSED; set_proc_state(np, UNUSED);
if (!xnspid->remove(np->pid, &np)) if (!xnspid->remove(np->pid, &np))
panic("fork: ns_remove"); panic("fork: ns_remove");
freeproc(np); freeproc(np);
...@@ -489,7 +490,7 @@ wait(void) ...@@ -489,7 +490,7 @@ wait(void)
SLIST_FOREACH_SAFE(p, &myproc()->childq, child_next, np) { SLIST_FOREACH_SAFE(p, &myproc()->childq, child_next, np) {
havekids = 1; havekids = 1;
acquire(&p->lock); acquire(&p->lock);
if(p->state == ZOMBIE){ if(get_proc_state(p) == ZOMBIE){
release(&p->lock); // noone else better be trying to lock p release(&p->lock); // noone else better be trying to lock p
pid = p->pid; pid = p->pid;
SLIST_REMOVE(&myproc()->childq, p, proc, child_next); SLIST_REMOVE(&myproc()->childq, p, proc, child_next);
...@@ -497,7 +498,7 @@ wait(void) ...@@ -497,7 +498,7 @@ wait(void)
ksfree(slab_stack, p->kstack); ksfree(slab_stack, p->kstack);
p->kstack = 0; p->kstack = 0;
p->vmap->decref(); p->vmap->decref();
p->state = UNUSED; set_proc_state(p, UNUSED);
if (!xnspid->remove(p->pid, &p)) if (!xnspid->remove(p->pid, &p))
panic("wait: ns_remove"); panic("wait: ns_remove");
p->pid = 0; p->pid = 0;
...@@ -568,7 +569,7 @@ threadpin(void (*fn)(void*), void *arg, const char *name, int cpu) ...@@ -568,7 +569,7 @@ threadpin(void (*fn)(void*), void *arg, const char *name, int cpu)
p->cpuid = cpu; p->cpuid = cpu;
p->cpu_pin = 1; p->cpu_pin = 1;
acquire(&p->lock); acquire(&p->lock);
p->state = RUNNABLE; set_proc_state(p, RUNNABLE);
addrun(p); addrun(p);
release(&p->lock); release(&p->lock);
} }
...@@ -29,7 +29,7 @@ addrun(struct proc *p) ...@@ -29,7 +29,7 @@ addrun(struct proc *p)
// Always called with p->lock held // Always called with p->lock held
struct runq *q; struct runq *q;
p->state = RUNNABLE; set_proc_state(p, RUNNABLE);
q = &runq[p->cpuid]; q = &runq[p->cpuid];
acquire(&q->lock); acquire(&q->lock);
...@@ -71,7 +71,7 @@ steal(void) ...@@ -71,7 +71,7 @@ steal(void)
if (tryacquire(&q->lock) == 0) if (tryacquire(&q->lock) == 0)
continue; continue;
STAILQ_FOREACH(p, &q->q, runqlink) { STAILQ_FOREACH(p, &q->q, runqlink) {
if (p->state == RUNNABLE && !p->cpu_pin && if (get_proc_state(p) == RUNNABLE && !p->cpu_pin &&
p->curcycles != 0 && p->curcycles > VICTIMAGE) p->curcycles != 0 && p->curcycles > VICTIMAGE)
{ {
STAILQ_REMOVE(&q->q, p, proc, runqlink); STAILQ_REMOVE(&q->q, p, proc, runqlink);
...@@ -83,7 +83,7 @@ steal(void) ...@@ -83,7 +83,7 @@ steal(void)
if (steal) { if (steal) {
acquire(&steal->lock); acquire(&steal->lock);
if (steal->state == RUNNABLE && !steal->cpu_pin && if (get_proc_state(steal) == RUNNABLE && !steal->cpu_pin &&
steal->curcycles != 0 && steal->curcycles > VICTIMAGE) steal->curcycles != 0 && steal->curcycles > VICTIMAGE)
{ {
//delrun(steal); //delrun(steal);
...@@ -94,7 +94,7 @@ steal(void) ...@@ -94,7 +94,7 @@ steal(void)
r = 1; r = 1;
break; break;
} }
if (steal->state == RUNNABLE) if (get_proc_state(steal) == RUNNABLE)
addrun(steal); addrun(steal);
release(&steal->lock); release(&steal->lock);
} }
......
...@@ -152,7 +152,7 @@ trap(struct trapframe *tf) ...@@ -152,7 +152,7 @@ trap(struct trapframe *tf)
// Force process to give up CPU on clock tick. // Force process to give up CPU on clock tick.
// If interrupts were on while locks held, would need to check nlock. // If interrupts were on while locks held, would need to check nlock.
if(myproc() && myproc()->state == RUNNING && tf->trapno == T_IRQ0+IRQ_TIMER) if(myproc() && get_proc_state(myproc()) == RUNNING && tf->trapno == T_IRQ0+IRQ_TIMER)
yield(); yield();
// Check if the process has been killed since we yielded // Check if the process has been killed since we yielded
......
...@@ -220,7 +220,7 @@ sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, ...@@ -220,7 +220,7 @@ sys_thread_new(const char *name, lwip_thread_fn thread, void *arg,
safestrcpy(p->name, name, sizeof(p->name)); safestrcpy(p->name, name, sizeof(p->name));
acquire(&p->lock); acquire(&p->lock);
p->state = RUNNABLE; set_proc_state(p, RUNNABLE);
addrun(p); addrun(p);
release(&p->lock); release(&p->lock);
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论