summaryrefslogtreecommitdiff
path: root/proc.c
diff options
context:
space:
mode:
authorrtm <rtm>2006-07-11 17:39:45 +0000
committerrtm <rtm>2006-07-11 17:39:45 +0000
commitb548df152b5a53ea8cfcb2d94fbdee07884d8050 (patch)
treeb1eec270a0892fad7a256ae809ebedbbcfaeb720 /proc.c
parent5ce9751cab960e3b226eb0720e781e793a0be4ed (diff)
downloadxv6-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.c42
1 files changed, 42 insertions, 0 deletions
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();
+}