From b548df152b5a53ea8cfcb2d94fbdee07884d8050 Mon Sep 17 00:00:00 2001 From: rtm Date: Tue, 11 Jul 2006 17:39:45 +0000 Subject: pre-empt both user and kernel, in clock interrupt usertest.c tests pre-emption kill() --- proc.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'proc.c') diff --git a/proc.c b/proc.c index bdff377..d7fc638 100644 --- a/proc.c +++ b/proc.c @@ -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(); +} -- cgit v1.2.3