Mercurial > hg > Papers > 2019 > menikon-sigos
view Paper/src/console.cbc @ 10:7b4fed4aefb1
add figures
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 08 May 2019 18:23:07 +0900 |
parents | |
children |
line wrap: on
line source
__code cbc_consoleread2 () { struct inode *ip = proc->cbc_arg.cbc_console_arg.ip; __code(*next)(int ret) = proc->cbc_arg.cbc_console_arg.next; if (input.r == input.w) { if (proc->killed) { release(&input.lock); ilock(ip); goto next(-1); } goto cbc_sleep(&input.r, &input.lock, cbc_consoleread2); } goto cbc_consoleread1(); } __code cbc_consoleread1 () { int cont = 1; 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; __code(*next)(int ret) = proc->cbc_arg.cbc_console_arg.next; int c = input.buf[input.r++ % INPUT_BUF]; if (c == C('D')) { // EOF if (n < target) { // Save ^D for next time, to make sure // caller gets a 0-byte result. input.r--; } cont = 0; } *dst++ = c; --n; if (c == '\n') { cont = 0; } 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.next = next; goto cbc_sleep(&input.r, &input.lock, cbc_consoleread2); } } release(&input.lock); ilock(ip); goto next(target - n); } __code cbc_consoleread (struct inode *ip, char *dst, int n, __code(*next)(int ret)) { uint target; iunlock(ip); target = n; acquire(&input.lock); 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.next = next; goto cbc_consoleread2(); } goto cbc_consoleread1(); }