提交 d844f0f9 创建 作者: rsc's avatar rsc

Change dev read/write functions

to take inode* instead of minor number. Unlock console inode during console_read and console_write. Otherwise background processes cannot write to console while the shell is reading it waiting for input.
上级 e3f271e8
...@@ -164,14 +164,16 @@ cprintf(char *fmt, ...) ...@@ -164,14 +164,16 @@ cprintf(char *fmt, ...)
} }
int int
console_write(int minor, char *buf, int n) console_write(struct inode *ip, char *buf, int n)
{ {
int i; int i;
iunlock(ip);
acquire(&console_lock); acquire(&console_lock);
for(i = 0; i < n; i++) for(i = 0; i < n; i++)
cons_putc(buf[i] & 0xff); cons_putc(buf[i] & 0xff);
release(&console_lock); release(&console_lock);
ilock(ip);
return n; return n;
} }
...@@ -230,17 +232,19 @@ console_intr(int (*getc)(void)) ...@@ -230,17 +232,19 @@ console_intr(int (*getc)(void))
} }
int int
console_read(int minor, char *dst, int n) console_read(struct inode *ip, char *dst, int n)
{ {
uint target; uint target;
int c; int c;
iunlock(ip);
target = n; target = n;
acquire(&input.lock); acquire(&input.lock);
while(n > 0){ while(n > 0){
while(input.r == input.w){ while(input.r == input.w){
if(cp->killed){ if(cp->killed){
release(&input.lock); release(&input.lock);
ilock(ip);
return -1; return -1;
} }
sleep(&input.r, &input.lock); sleep(&input.r, &input.lock);
...@@ -262,6 +266,7 @@ console_read(int minor, char *dst, int n) ...@@ -262,6 +266,7 @@ console_read(int minor, char *dst, int n)
input.r = 0; input.r = 0;
} }
release(&input.lock); release(&input.lock);
ilock(ip);
return target - n; return target - n;
} }
...@@ -274,7 +279,7 @@ console_init(void) ...@@ -274,7 +279,7 @@ console_init(void)
devsw[CONSOLE].write = console_write; devsw[CONSOLE].write = console_write;
devsw[CONSOLE].read = console_read; devsw[CONSOLE].read = console_read;
use_console_lock = 1; //use_console_lock = 1;
irq_enable(IRQ_KBD); irq_enable(IRQ_KBD);
ioapic_enable(IRQ_KBD, 0); ioapic_enable(IRQ_KBD, 0);
......
struct devsw { struct devsw {
int (*read)(int, char*, int); int (*read)(struct inode*, char*, int);
int (*write)(int, char*, int); int (*write)(struct inode*, char*, int);
}; };
extern struct devsw devsw[]; extern struct devsw devsw[];
......
...@@ -411,7 +411,7 @@ readi(struct inode *ip, char *dst, uint off, uint n) ...@@ -411,7 +411,7 @@ readi(struct inode *ip, char *dst, uint off, uint n)
if(ip->type == T_DEV) { if(ip->type == T_DEV) {
if(ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].read) if(ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].read)
return -1; return -1;
return devsw[ip->major].read(ip->minor, dst, n); return devsw[ip->major].read(ip, dst, n);
} }
if(off > ip->size || off + n < off) if(off > ip->size || off + n < off)
...@@ -439,7 +439,7 @@ writei(struct inode *ip, char *src, uint off, uint n) ...@@ -439,7 +439,7 @@ writei(struct inode *ip, char *src, uint off, uint n)
if(ip->type == T_DEV) { if(ip->type == T_DEV) {
if(ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].write) if(ip->major < 0 || ip->major >= NDEV || !devsw[ip->major].write)
return -1; return -1;
return devsw[ip->major].write(ip->minor, src, n); return devsw[ip->major].write(ip, src, n);
} }
if(off + n < off) if(off + n < off)
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论