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 /syscall.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 'syscall.c')
-rw-r--r-- | syscall.c | 48 |
1 files changed, 22 insertions, 26 deletions
@@ -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 |