From 46bbd72f3eeaff9386b2a90af88f3d46b458a0e8 Mon Sep 17 00:00:00 2001 From: rtm Date: Sat, 15 Jul 2006 12:03:57 +0000 Subject: no more recursive locks wakeup1() assumes you hold proc_table_lock sleep(chan, lock) provides atomic sleep-and-release to wait for condition ugly code in swtch/scheduler to implement new sleep fix lots of bugs in pipes, wait, and exit fix bugs if timer interrupt goes off in schedule() console locks per line, not per byte --- pipe.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'pipe.c') diff --git a/pipe.c b/pipe.c index 3975244..7ebe006 100644 --- a/pipe.c +++ b/pipe.c @@ -81,16 +81,17 @@ 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){ + release(&p->lock); return -1; - release(&p->lock); + } wakeup(&p->readp); - sleep(&p->writep); - acquire(&p->lock); + sleep(&p->writep, &p->lock); } p->data[p->writep] = addr[i]; p->writep = (p->writep + 1) % PIPESIZE; } + release(&p->lock); wakeup(&p->readp); return i; @@ -101,19 +102,23 @@ pipe_read(struct pipe *p, char *addr, int n) { int i; + acquire(&p->lock); + while(p->readp == p->writep){ - if(p->writeopen == 0) + if(p->writeopen == 0){ + release(&p->lock); return 0; - sleep(&p->readp); + } + sleep(&p->readp, &p->lock); } - acquire(&p->lock); for(i = 0; i < n; i++){ if(p->readp == p->writep) break; addr[i] = p->data[p->readp]; p->readp = (p->readp + 1) % PIPESIZE; } + release(&p->lock); wakeup(&p->writep); return i; -- cgit v1.2.3