Mercurial > hg > Members > menikon > CbC_xv6
changeset 32:96af12a50fdb
fix cbc_read
author | mir3636 |
---|---|
date | Tue, 22 Jan 2019 15:48:35 +0900 |
parents | 96a5833d0d82 |
children | 7a63dacab7f8 |
files | src/console.c src/file.c src/fs.c src/proc.c src/proc.h src/syscall.c |
diffstat | 6 files changed, 36 insertions(+), 35 deletions(-) [+] |
line wrap: on
line diff
--- a/src/console.c Fri Jan 18 18:20:02 2019 +0900 +++ b/src/console.c Tue Jan 22 15:48:35 2019 +0900 @@ -12,8 +12,8 @@ #include "mmu.h" #include "proc.h" -__code cbc_consoleread1 (__code(*)(int)); -__code cbc_consoleread2 (__code(*)(int)); +__code cbc_consoleread1 (); +__code cbc_consoleread2 (); static void consputc (int); @@ -233,19 +233,10 @@ release(&input.lock); } -__code cbc_consoleread2 (__code(*next)(int ret)) +__code cbc_consoleread2 () { - int n = proc->cbc_arg.cbc_console_arg.n; - int target = proc->cbc_arg.cbc_console_arg.target; - char* dst = proc->cbc_arg.cbc_console_arg.dst; struct inode *ip = proc->cbc_arg.cbc_console_arg.ip; - struct file *f = proc->cbc_arg.cbc_console_arg.f; - proc->cbc_arg.cbc_console_arg.n = n; - proc->cbc_arg.cbc_console_arg.target = target; - proc->cbc_arg.cbc_console_arg.dst = dst; - proc->cbc_arg.cbc_console_arg.ip = ip; - proc->cbc_arg.cbc_console_arg.f = f; - proc->cbc_arg.cbc_console_arg.next = next; + __code(*next)(int ret) = proc->cbc_arg.cbc_console_arg.next; if (input.r == input.w) { if (proc->killed) { release(&input.lock); @@ -254,10 +245,10 @@ } goto cbc_sleep(&input.r, &input.lock, cbc_consoleread2); } - goto cbc_consoleread1(0); + goto cbc_consoleread1(); } -__code cbc_consoleread1 (__code(*next)(int ret)) +__code cbc_consoleread1 () { int cont = 1; int n = proc->cbc_arg.cbc_console_arg.n; @@ -265,6 +256,7 @@ char* dst = proc->cbc_arg.cbc_console_arg.dst; struct inode *ip = proc->cbc_arg.cbc_console_arg.ip; struct file *f = proc->cbc_arg.cbc_console_arg.f; + __code(*next)(int ret) = proc->cbc_arg.cbc_console_arg.next; int c = input.buf[input.r++ % INPUT_BUF]; @@ -284,14 +276,16 @@ cont = 0; } - if (n > 0) { - proc->cbc_arg.cbc_console_arg.n = n; - proc->cbc_arg.cbc_console_arg.target = target; - proc->cbc_arg.cbc_console_arg.dst = dst; - proc->cbc_arg.cbc_console_arg.ip = ip; - proc->cbc_arg.cbc_console_arg.f = f; - proc->cbc_arg.cbc_console_arg.next = next; - goto cbc_sleep(&input.r, &input.lock, cbc_consoleread2); + if (cont == 1) { + if (n > 0) { + proc->cbc_arg.cbc_console_arg.n = n; + proc->cbc_arg.cbc_console_arg.target = target; + proc->cbc_arg.cbc_console_arg.dst = dst; + proc->cbc_arg.cbc_console_arg.ip = ip; + proc->cbc_arg.cbc_console_arg.f = f; + proc->cbc_arg.cbc_console_arg.next = next; + goto cbc_sleep(&input.r, &input.lock, cbc_consoleread2); + } } release(&input.lock); @@ -305,7 +299,7 @@ //goto next(target - n); - goto cbc_ret(r); + goto next(r); } __code cbc_consoleread (struct inode *ip, char *dst, int n, struct file *f, __code(*next)(int ret))
--- a/src/file.c Fri Jan 18 18:20:02 2019 +0900 +++ b/src/file.c Tue Jan 22 15:48:35 2019 +0900 @@ -8,6 +8,7 @@ #include "fs.h" #include "file.h" #include "spinlock.h" +#include "proc.h" struct devsw devsw[NDEV]; struct cbc_devsw cbc_devsw[NDEV]; @@ -100,7 +101,7 @@ return -1; } -__code cbc_fileread1 (int r, struct file *f, char *addr, int n, __code (*next)(int ret)) +__code cbc_fileread1 (int r, struct file *f, __code (*next)(int ret)) { if (r > 0) f->off += r; @@ -110,8 +111,6 @@ __code cbc_fileread (struct file *f, char *addr, int n, __code (*next)(int ret)) { - int r; - if (f->readable == 0) { goto next(-1); } @@ -123,7 +122,6 @@ if (f->type == FD_INODE) { ilock(f->ip); - goto cbc_readi(f->ip, addr, f->off, n, f, next); }
--- a/src/fs.c Fri Jan 18 18:20:02 2019 +0900 +++ b/src/fs.c Tue Jan 22 15:48:35 2019 +0900 @@ -481,6 +481,10 @@ brelse(bp); } + if (n > 0) + f->off += n; + iunlock(f->ip); + goto next(n); }
--- a/src/proc.c Fri Jan 18 18:20:02 2019 +0900 +++ b/src/proc.c Tue Jan 22 15:48:35 2019 +0900 @@ -471,6 +471,7 @@ } proc->chan = chan; proc->state = SLEEPING; + proc->lk = lk; proc->cbc_next = next1; goto cbc_sched(cbc_sleep1);
--- a/src/proc.h Fri Jan 18 18:20:02 2019 +0900 +++ b/src/proc.h Tue Jan 22 15:48:35 2019 +0900 @@ -71,11 +71,12 @@ union cbc_arg { struct cbc_console_arg { int n; - int target; - char* dst; - struct inode *ip; - struct file *f; - __code (*next)(int ret); + int target; + char* dst; + struct inode *ip; + struct file *f; + int num; + __code (*next)(int ret); } cbc_console_arg; } cbc_arg; __code (*cbc_next)();
--- a/src/syscall.c Fri Jan 18 18:20:02 2019 +0900 +++ b/src/syscall.c Tue Jan 22 15:48:35 2019 +0900 @@ -150,7 +150,10 @@ } __code cbc_ret(int ret){ - proc->tf->r0 = ret; + int num = proc->cbc_arg.cbc_console_arg.num; + if (num != SYS_exec) { + proc->tf->r0 = ret; + } goto cbc_trap_return(); } @@ -166,7 +169,7 @@ //cprintf ("syscall(%d) from %s(%d)\n", num, proc->name, proc->pid); if((num >= NELEM(syscalls)) && (num <= NELEM(cbccodes)) && cbccodes[num]) { - + proc->cbc_arg.cbc_console_arg.num = num; goto (cbccodes[num])(cbc_ret); }