diff options
author | rsc <rsc> | 2006-07-15 17:24:54 +0000 |
---|---|---|
committer | rsc <rsc> | 2006-07-15 17:24:54 +0000 |
commit | 643b122b4a721dbdb208ec5f8d15e56b63ac58d5 (patch) | |
tree | 4a45e90f51b9b9b2fb172f289caad30ac57789fe /proc.c | |
parent | 3497670122cd0561661a0a2e617ec9ece789c2f0 (diff) | |
download | xv6-labs-643b122b4a721dbdb208ec5f8d15e56b63ac58d5.tar.gz xv6-labs-643b122b4a721dbdb208ec5f8d15e56b63ac58d5.tar.bz2 xv6-labs-643b122b4a721dbdb208ec5f8d15e56b63ac58d5.zip |
move everything having to do with proc_table_lock into proc.c
Diffstat (limited to 'proc.c')
-rw-r--r-- | proc.c | 50 |
1 files changed, 50 insertions, 0 deletions
@@ -281,6 +281,56 @@ proc_exit() panic("a zombie revived"); } +int +proc_wait(void) +{ + struct proc *p; + struct proc *cp = curproc[cpu()]; + int any, pid; + + acquire(&proc_table_lock); + + while(1){ + any = 0; + for(p = proc; p < &proc[NPROC]; p++){ + if(p->state == ZOMBIE && p->ppid == cp->pid){ + kfree(p->mem, p->sz); + kfree(p->kstack, KSTACKSIZE); + pid = p->pid; + p->state = UNUSED; + release(&proc_table_lock); + return pid; + } + if(p->state != UNUSED && p->ppid == cp->pid) + any = 1; + } + if(any == 0){ + release(&proc_table_lock); + return -1; + } + sleep(cp, &proc_table_lock); + } +} + +int +proc_kill(int pid) +{ + struct proc *p; + + acquire(&proc_table_lock); + for(p = proc; p < &proc[NPROC]; p++){ + if(p->pid == pid && p->state != UNUSED){ + p->killed = 1; + if(p->state == WAITING) + p->state = RUNNABLE; + release(&proc_table_lock); + return 0; + } + } + release(&proc_table_lock); + return -1; +} + // disable interrupts void cli(void) |