From 02cc595f28f10067dcaacc7e147a3db7da277244 Mon Sep 17 00:00:00 2001 From: kolya Date: Fri, 22 Aug 2008 00:26:22 +0000 Subject: [PATCH] clean up circular buffers, so pipe can queue 512 bytes rather than 511 --- console.c | 14 +++++++------- pipe.c | 12 +++++------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/console.c b/console.c index 5e5f034..8681540 100644 --- a/console.c +++ b/console.c @@ -186,9 +186,9 @@ console_write(struct inode *ip, char *buf, int n) struct { struct spinlock lock; char buf[INPUT_BUF]; - int r; // Read index - int w; // Write index - int e; // Edit index + uint r; // Read index + uint w; // Write index + uint e; // Edit index } input; #define C(x) ((x)-'@') // Control-x @@ -205,20 +205,20 @@ console_intr(int (*getc)(void)) procdump(); break; case C('U'): // Kill line. - while(input.e > input.w && + while(input.e != input.w && input.buf[(input.e-1) % INPUT_BUF] != '\n'){ input.e--; cons_putc(BACKSPACE); } break; case C('H'): // Backspace - if(input.e > input.w){ + if(input.e != input.w){ input.e--; cons_putc(BACKSPACE); } break; default: - if(c != 0 && input.e < input.r+INPUT_BUF){ + if(c != 0 && input.e-input.r < INPUT_BUF){ input.buf[input.e++ % INPUT_BUF] = c; cons_putc(c); if(c == '\n' || c == C('D') || input.e == input.r+INPUT_BUF){ @@ -293,7 +293,7 @@ panic(char *s) __asm __volatile("cli"); use_console_lock = 0; cprintf("cpu%d: panic: ", cpu()); - cprintf(s, 0); + cprintf(s); cprintf("\n"); getcallerpcs(&s, pcs); for(i=0; i<10; i++) diff --git a/pipe.c b/pipe.c index 43f623a..fda3788 100644 --- a/pipe.c +++ b/pipe.c @@ -11,8 +11,8 @@ struct pipe { int readopen; // read fd is still open int writeopen; // write fd is still open - int writep; // next index to write - int readp; // next index to read + uint writep; // next index to write + uint readp; // next index to read struct spinlock lock; char data[PIPESIZE]; }; @@ -83,7 +83,7 @@ pipewrite(struct pipe *p, char *addr, int n) acquire(&p->lock); for(i = 0; i < n; i++){ - while(((p->writep + 1) % PIPESIZE) == p->readp){ + while(p->writep == p->readp + PIPESIZE) { if(p->readopen == 0 || cp->killed){ release(&p->lock); return -1; @@ -91,8 +91,7 @@ pipewrite(struct pipe *p, char *addr, int n) wakeup(&p->readp); sleep(&p->writep, &p->lock); } - p->data[p->writep] = addr[i]; - p->writep = (p->writep + 1) % PIPESIZE; + p->data[p->writep++ % PIPESIZE] = addr[i]; } wakeup(&p->readp); release(&p->lock); @@ -115,8 +114,7 @@ piperead(struct pipe *p, char *addr, int n) for(i = 0; i < n; i++){ if(p->readp == p->writep) break; - addr[i] = p->data[p->readp]; - p->readp = (p->readp + 1) % PIPESIZE; + addr[i] = p->data[p->readp++ % PIPESIZE]; } wakeup(&p->writep); release(&p->lock);