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() --- syscall.c | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) (limited to 'syscall.c') 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 -- cgit v1.2.3