From f2f062da61eaca1dee675281c3b6b95d220ab322 Mon Sep 17 00:00:00 2001 From: rsc Date: Wed, 8 Aug 2007 10:29:42 +0000 Subject: [PATCH] check p->killed for long-lived sleeps --- console.c | 8 +++++++- pipe.c | 4 ++-- proc.c | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/console.c b/console.c index ec3ecd0..cd52570 100644 --- a/console.c +++ b/console.c @@ -6,6 +6,7 @@ #include "dev.h" #include "param.h" #include "mmu.h" +#include "proc.h" struct spinlock console_lock; int panicked = 0; @@ -395,8 +396,13 @@ console_read(int minor, char *dst, int n) target = n; acquire(&kbd_lock); while(n > 0){ - while(kbd_r == kbd_w) + while(kbd_r == kbd_w){ + if(curproc[cpu()]->killed){ + release(&kbd_lock); + return -1; + } sleep(&kbd_r, &kbd_lock); + } c = kbd_buf[kbd_r++]; if(c == C('D')){ // EOF if(n < target){ diff --git a/pipe.c b/pipe.c index 7ef89e2..923e609 100644 --- a/pipe.c +++ b/pipe.c @@ -86,7 +86,7 @@ pipe_write(struct pipe *p, char *addr, int n) for(i = 0; i < n; i++){ while(((p->writep + 1) % PIPESIZE) == p->readp){ - if(p->readopen == 0){ + if(p->readopen == 0 || curproc[cpu()]->killed){ release(&p->lock); return -1; } @@ -110,7 +110,7 @@ pipe_read(struct pipe *p, char *addr, int n) acquire(&p->lock); while(p->readp == p->writep){ - if(p->writeopen == 0){ + if(p->writeopen == 0 || curproc[cpu()]->killed){ release(&p->lock); return 0; } diff --git a/proc.c b/proc.c index 96f96d9..37adbb4 100644 --- a/proc.c +++ b/proc.c @@ -405,7 +405,7 @@ proc_wait(void) } // No point waiting if we don't have any children. - if(!havekids){ + if(!havekids || cp->killed){ release(&proc_table_lock); return -1; }