int main() {
オプション解析や初期化など。
main_loop();
}
main_loop() {
for(;;) {
if(実行中) {
for(;;) {
ret = cpu_exec(); /* Basic Block 実行 */
if(割り込みがあった) {
ret = EXCP_INTERRUPT;
break;
}
}
if(ret == EXCP_HALTED)
timeout = 10;
else
timeout = 0;
main_loop_wait(timeout);
}
}
}
らしい。基本ブロックを実行して main_loop_wait() して、の繰り返し。
cpu_exec(env) {
if(BB キャッシュあり) {
そのまま実行 (機械語列に制御を渡す)
} else {
BB を JIT して、キャッシュしておく。
}
}
main_loop_wait() {
/* XXX: need to suppress polling by better using win32 events */
ret = 0;
for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
ret |= pe->func(pe->opaque);
}
#ifdef _WIN32
if(ret == 0) {
ret = WaitForMultipleObjects(....., timeout);
#endif
}
timeout が 0 の場合、条件を調べて即制御を返す。
0 件のコメント:
コメントを投稿