Skip to content
Snippets Groups Projects
Commit 02cc595f authored by kolya's avatar kolya
Browse files

clean up circular buffers, so pipe can queue 512 bytes rather than 511

parent 5c5470a2
No related branches found
No related tags found
No related merge requests found
......@@ -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++)
......
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment