summaryrefslogtreecommitdiff
path: root/syscall.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 /syscall.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 'syscall.c')
-rw-r--r--syscall.c48
1 files changed, 22 insertions, 26 deletions
diff --git a/syscall.c b/syscall.c
index 03fe608..4ecb31c 100644
--- a/syscall.c
+++ b/syscall.c
@@ -155,32 +155,7 @@ sys_fork()
int
sys_exit()
{
- struct proc *p;
- struct proc *cp = curproc[cpu()];
- int fd;
-
- 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();
-
+ proc_exit();
return 0;
}
@@ -250,6 +225,24 @@ sys_block(void)
return 0;
}
+int
+sys_kill()
+{
+ int pid;
+ struct proc *p;
+
+ fetcharg(0, &pid);
+ for(p = proc; p < &proc[NPROC]; p++){
+ if(p->pid == pid && p->state != UNUSED){
+ p->killed = 1;
+ if(p->state == WAITING)
+ p->state = RUNNABLE;
+ return 0;
+ }
+ }
+ return -1;
+}
+
void
syscall()
{
@@ -286,6 +279,9 @@ syscall()
case SYS_block:
ret = sys_block();
break;
+ case SYS_kill:
+ ret = sys_kill();
+ break;
default:
cprintf("unknown sys call %d\n", num);
// XXX fault