diff options
author | rtm <rtm> | 2006-06-15 19:58:01 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-06-15 19:58:01 +0000 |
commit | be0a7eacdab4443199ed0ed4379a84edc7c98fd6 (patch) | |
tree | 5528a9d64865c1f29ded1f179ebf408e50df3d50 /syscall.c | |
parent | a4c03dea09b7b5f2463147e979d20b035b81de96 (diff) | |
download | xv6-labs-be0a7eacdab4443199ed0ed4379a84edc7c98fd6.tar.gz xv6-labs-be0a7eacdab4443199ed0ed4379a84edc7c98fd6.tar.bz2 xv6-labs-be0a7eacdab4443199ed0ed4379a84edc7c98fd6.zip |
sleep, wakeup, wait, exit
Diffstat (limited to 'syscall.c')
-rw-r--r-- | syscall.c | 48 |
1 files changed, 46 insertions, 2 deletions
@@ -24,12 +24,53 @@ sys_fork() void sys_exit() { - curproc->state = UNUSED; - // XXX free resources. notify parent. abandon children. + struct proc *p; + + curproc->state = ZOMBIE; + + // wake up parent + for(p = proc; p < &proc[NPROC]; p++) + if(p->pid == curproc->ppid) + wakeup(p); + + // abandon children + for(p = proc; p < &proc[NPROC]; p++) + if(p->ppid == curproc->pid) + p->pid = 1; + swtch(); } void +sys_wait() +{ + struct proc *p; + int any; + + cprintf("waid pid %d ppid %d\n", curproc->pid, curproc->ppid); + + while(1){ + any = 0; + for(p = proc; p < &proc[NPROC]; p++){ + if(p->state == ZOMBIE && p->ppid == curproc->pid){ + kfree(p->mem, p->sz); + kfree(p->kstack, KSTACKSIZE); + p->state = UNUSED; + cprintf("%x collected %x\n", curproc, p); + return; + } + if(p->state != UNUSED && p->ppid == curproc->pid) + any = 1; + } + if(any == 0){ + cprintf("%x nothing to wait for\n", curproc); + return; + } + sleep(curproc); + } +} + +void syscall() { int num = curproc->tf->tf_regs.reg_eax; @@ -42,6 +83,9 @@ syscall() case SYS_exit: sys_exit(); break; + case SYS_wait: + sys_wait(); + break; default: cprintf("unknown sys call %d\n", num); // XXX fault |