diff options
Diffstat (limited to 'kernel/proc.c')
-rw-r--r-- | kernel/proc.c | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/kernel/proc.c b/kernel/proc.c index 5e37cb7..8d0ca8c 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -53,6 +53,7 @@ procinit(void) initlock(&wait_lock, "wait_lock"); for(p = proc; p < &proc[NPROC]; p++) { initlock(&p->lock, "proc"); + p->state = UNUSED; p->kstack = KSTACK((int) (p - proc)); } } @@ -170,8 +171,8 @@ freeproc(struct proc *p) p->state = UNUSED; } -// Create a user page table for a given process, -// with no user memory, but with trampoline pages. +// Create a user page table for a given process, with no user memory, +// but with trampoline and trapframe pages. pagetable_t proc_pagetable(struct proc *p) { @@ -192,7 +193,8 @@ proc_pagetable(struct proc *p) return 0; } - // map the trapframe just below TRAMPOLINE, for trampoline.S. + // map the trapframe page just below the trampoline page, for + // trampoline.S. if(mappages(pagetable, TRAPFRAME, PGSIZE, (uint64)(p->trapframe), PTE_R | PTE_W) < 0){ uvmunmap(pagetable, TRAMPOLINE, 1, 0); @@ -257,7 +259,7 @@ userinit(void) int growproc(int n) { - uint sz; + uint64 sz; struct proc *p = myproc(); sz = p->sz; @@ -388,7 +390,7 @@ exit(int status) int wait(uint64 addr) { - struct proc *np; + struct proc *pp; int havekids, pid; struct proc *p = myproc(); @@ -397,27 +399,27 @@ wait(uint64 addr) for(;;){ // Scan through table looking for exited children. havekids = 0; - for(np = proc; np < &proc[NPROC]; np++){ - if(np->parent == p){ + for(pp = proc; pp < &proc[NPROC]; pp++){ + if(pp->parent == p){ // make sure the child isn't still in exit() or swtch(). - acquire(&np->lock); + acquire(&pp->lock); havekids = 1; - if(np->state == ZOMBIE){ + if(pp->state == ZOMBIE){ // Found one. - pid = np->pid; - if(addr != 0 && copyout(p->pagetable, addr, (char *)&np->xstate, - sizeof(np->xstate)) < 0) { - release(&np->lock); + pid = pp->pid; + if(addr != 0 && copyout(p->pagetable, addr, (char *)&pp->xstate, + sizeof(pp->xstate)) < 0) { + release(&pp->lock); release(&wait_lock); return -1; } - freeproc(np); - release(&np->lock); + freeproc(pp); + release(&pp->lock); release(&wait_lock); return pid; } - release(&np->lock); + release(&pp->lock); } } @@ -658,6 +660,7 @@ procdump(void) { static char *states[] = { [UNUSED] "unused", + [USED] "used", [SLEEPING] "sleep ", [RUNNABLE] "runble", [RUNNING] "run ", |