pipe_close(struct pipe *p, int writable)
{
acquire(&p->lock);
-
if(writable){
p->writeopen = 0;
wakeup(&p->readp);
p->readopen = 0;
wakeup(&p->writep);
}
-
release(&p->lock);
if(p->readopen == 0 && p->writeopen == 0)
int i;
acquire(&p->lock);
-
for(i = 0; i < n; i++){
while(((p->writep + 1) % PIPESIZE) == p->readp){
if(p->readopen == 0 || cp->killed){
p->data[p->writep] = addr[i];
p->writep = (p->writep + 1) % PIPESIZE;
}
-
- release(&p->lock);
wakeup(&p->readp);
+ release(&p->lock);
return i;
}
int i;
acquire(&p->lock);
-
while(p->readp == p->writep){
if(p->writeopen == 0 || cp->killed){
release(&p->lock);
addr[i] = p->data[p->readp];
p->readp = (p->readp + 1) % PIPESIZE;
}
-
- release(&p->lock);
wakeup(&p->writep);
+ release(&p->lock);
return i;
}