check p->killed for long-lived sleeps
This commit is contained in:
parent
1cb183a987
commit
f2f062da61
3 changed files with 10 additions and 4 deletions
|
@ -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){
|
||||
|
|
4
pipe.c
4
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;
|
||||
}
|
||||
|
|
2
proc.c
2
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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue