diff options
author | rtm <rtm> | 2006-07-11 17:39:45 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-07-11 17:39:45 +0000 |
commit | b548df152b5a53ea8cfcb2d94fbdee07884d8050 (patch) | |
tree | b1eec270a0892fad7a256ae809ebedbbcfaeb720 /proc.c | |
parent | 5ce9751cab960e3b226eb0720e781e793a0be4ed (diff) | |
download | xv6-labs-b548df152b5a53ea8cfcb2d94fbdee07884d8050.tar.gz xv6-labs-b548df152b5a53ea8cfcb2d94fbdee07884d8050.tar.bz2 xv6-labs-b548df152b5a53ea8cfcb2d94fbdee07884d8050.zip |
pre-empt both user and kernel, in clock interrupt
usertest.c tests pre-emption
kill()
Diffstat (limited to 'proc.c')
-rw-r--r-- | proc.c | 42 |
1 files changed, 42 insertions, 0 deletions
@@ -184,3 +184,45 @@ wakeup(void *chan) if(p->state == WAITING && p->chan == chan) p->state = RUNNABLE; } + +// give up the CPU but stay marked as RUNNABLE +void +yield() +{ + if(curproc[cpu()] == 0 || curproc[cpu()]->state != RUNNING) + panic("yield"); + curproc[cpu()]->state = RUNNABLE; + swtch(); +} + +void +proc_exit() +{ + struct proc *p; + struct proc *cp = curproc[cpu()]; + int fd; + + cprintf("exit %x\n", cp); + + for(fd = 0; fd < NOFILE; fd++){ + if(cp->fds[fd]){ + fd_close(cp->fds[fd]); + cp->fds[fd] = 0; + } + } + + cp->state = ZOMBIE; + + // wake up parent + for(p = proc; p < &proc[NPROC]; p++) + if(p->pid == cp->ppid) + wakeup(p); + + // abandon children + for(p = proc; p < &proc[NPROC]; p++) + if(p->ppid == cp->pid) + p->pid = 1; + + // switch into scheduler + swtch(); +} |