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.
This commit is contained in:
parent
e3f271e880
commit
d844f0f9d9
3 changed files with 12 additions and 7 deletions
11
console.c
11
console.c
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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);
|
||||||
|
|
4
dev.h
4
dev.h
|
@ -1,6 +1,6 @@
|
||||||
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[];
|
||||||
|
|
4
fs.c
4
fs.c
|
@ -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)
|
||||||
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)
|
||||||
|
|
Loading…
Reference in a new issue