summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <rsc>2007-08-14 19:10:57 +0000
committerrsc <rsc>2007-08-14 19:10:57 +0000
commitea6e370964465783e28afc5e7c92d50096899059 (patch)
tree5824d583b3b37b6b57cb636fb7c0a0fbe0784081
parent4bc5056c19457f2c7128449259b770174d3361c9 (diff)
downloadxv6-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
-rw-r--r--pipe.c10
1 files changed, 2 insertions, 8 deletions
diff --git a/pipe.c b/pipe.c
index a207df1..5e1fed2 100644
--- a/pipe.c
+++ b/pipe.c
@@ -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;
}