summaryrefslogtreecommitdiff
path: root/proc.c
diff options
context:
space:
mode:
authorrsc <rsc>2006-07-15 17:24:54 +0000
committerrsc <rsc>2006-07-15 17:24:54 +0000
commit643b122b4a721dbdb208ec5f8d15e56b63ac58d5 (patch)
tree4a45e90f51b9b9b2fb172f289caad30ac57789fe /proc.c
parent3497670122cd0561661a0a2e617ec9ece789c2f0 (diff)
downloadxv6-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.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/proc.c b/proc.c
index e69f1d1..76ec64e 100644
--- a/proc.c
+++ b/proc.c
@@ -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)