commit f2f062da61eaca1dee675281c3b6b95d220ab322
parent 1cb183a987bb08cb0b25a6b8bd7e4011325c8ca9
Author: rsc <rsc>
Date: Wed, 8 Aug 2007 10:29:42 +0000
check p->killed for long-lived sleeps
Diffstat:
3 files changed, 10 insertions(+), 4 deletions(-)
diff --git 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
@@ -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
@@ -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;
}