diff --git a/pipe.c b/pipe.c index 5e1fed2..cd27cbf 100644 --- a/pipe.c +++ b/pipe.c @@ -25,12 +25,10 @@ pipe_alloc(struct file **f0, struct file **f1) p = 0; *f0 = *f1 = 0; - if((*f0 = filealloc()) == 0) - goto oops; - if((*f1 = filealloc()) == 0) - goto oops; - if((p = (struct pipe*) kalloc(PAGE)) == 0) - goto oops; + if((*f0 = filealloc()) == 0 || (*f1 = filealloc()) == 0) + goto bad; + if((p = (struct pipe*)kalloc(PAGE)) == 0) + goto bad; p->readopen = 1; p->writeopen = 1; p->writep = 0; @@ -46,9 +44,9 @@ pipe_alloc(struct file **f0, struct file **f1) (*f1)->pipe = p; return 0; - oops: + bad: if(p) - kfree((char*) p, PAGE); + kfree((char*)p, PAGE); if(*f0){ (*f0)->type = FD_NONE; fileclose(*f0); @@ -74,7 +72,7 @@ pipe_close(struct pipe *p, int writable) release(&p->lock); if(p->readopen == 0 && p->writeopen == 0) - kfree((char*) p, PAGE); + kfree((char*)p, PAGE); } //PAGEBREAK: 20 @@ -107,10 +105,10 @@ pipe_read(struct pipe *p, char *addr, int n) int i; acquire(&p->lock); - while(p->readp == p->writep){ - if(p->writeopen == 0 || cp->killed){ + while(p->readp == p->writep && p->writeopen){ + if(cp->killed){ release(&p->lock); - return 0; + return -1; } sleep(&p->readp, &p->lock); }