jmp
命令で次の処理に移動する__code
で宣言する__code cbc_read(__code (*next)(int ret)){
struct file *f;
int n;
char *p;
if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argptr(1, &p, n) < 0) {
goto next(-1);
}
goto cbc_fileread(f, p, n, next);
}
read
システムコールの例goto
文で呼び出すvoid syscall(void)
{
int num;
int ret;
if((num >= NELEM(syscalls)) && (num <= NELEM(cbccodes)) && cbccodes[num]) {
proc->cbc_arg.cbc_console_arg.num = num;
goto (cbccodes[num])(cbc_ret);
}
goto
文を利用する場合はcontextからデータを参照するtype
によって継続先を変更する__code cbc_fileread (struct file *f, char *addr, int n, __code (*next)(int ret))
{
if (f->readable == 0) {
goto next(-1);
}
if (f->type == FD_PIPE) {
goto cbc_piperead(f->pipe, addr, n, next);
}
if (f->type == FD_INODE) {
ilock(f->ip);
proc->cbc_arg.cbc_console_arg.f = f;
goto cbc_readi(f->ip, addr, f->off, n, cbc_fileread1);
}
goto cbc_panic("fileread");
}