diff options
author | rsc <rsc> | 2007-08-14 19:10:57 +0000 |
---|---|---|
committer | rsc <rsc> | 2007-08-14 19:10:57 +0000 |
commit | ea6e370964465783e28afc5e7c92d50096899059 (patch) | |
tree | 5824d583b3b37b6b57cb636fb7c0a0fbe0784081 /pipe.c | |
parent | 4bc5056c19457f2c7128449259b770174d3361c9 (diff) | |
download | xv6-labs-ea6e370964465783e28afc5e7c92d50096899059.tar.gz xv6-labs-ea6e370964465783e28afc5e7c92d50096899059.tar.bz2 xv6-labs-ea6e370964465783e28afc5e7c92d50096899059.zip |
i cannot prove that release before wakeup is wrong, but i cannot convince myself it is right either
Diffstat (limited to 'pipe.c')
-rw-r--r-- | pipe.c | 10 |
1 files changed, 2 insertions, 8 deletions
@@ -64,7 +64,6 @@ void pipe_close(struct pipe *p, int writable) { acquire(&p->lock); - if(writable){ p->writeopen = 0; wakeup(&p->readp); @@ -72,7 +71,6 @@ pipe_close(struct pipe *p, int writable) p->readopen = 0; wakeup(&p->writep); } - release(&p->lock); if(p->readopen == 0 && p->writeopen == 0) @@ -86,7 +84,6 @@ pipe_write(struct pipe *p, char *addr, int n) int i; acquire(&p->lock); - for(i = 0; i < n; i++){ while(((p->writep + 1) % PIPESIZE) == p->readp){ if(p->readopen == 0 || cp->killed){ @@ -99,9 +96,8 @@ pipe_write(struct pipe *p, char *addr, int n) p->data[p->writep] = addr[i]; p->writep = (p->writep + 1) % PIPESIZE; } - - release(&p->lock); wakeup(&p->readp); + release(&p->lock); return i; } @@ -111,7 +107,6 @@ 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){ release(&p->lock); @@ -125,8 +120,7 @@ pipe_read(struct pipe *p, char *addr, int n) addr[i] = p->data[p->readp]; p->readp = (p->readp + 1) % PIPESIZE; } - - release(&p->lock); wakeup(&p->writep); + release(&p->lock); return i; } |