Open3
(skip)
ピン留めされたアイテム

ちょっと方針変更:
- AsyncifyのランタイムはWasmモジュール側に持たせる
-
vfork
とsetjmp
でほぼ同じルーチンを実装しておいて、longjmp
に相当する機能はrunnerから呼べるようにする
これで行けるんではないか。。

vfork
を実装するためには setjmp
longjmp
に相当する処理を実装する必要があるので渋々Asyncifyに対応する。
AsyncifyはWasmモジュールにかけられる"変換"の一種で、Binaryenに実装されている。
Asyncifyに変換されたWasm内の関数は任意のタイミングで中断(無理矢理return)できるようになり、さらに、無理矢理returnされたところまで途中の処理をskipしながら戻ることもできる。

Asyncifyのインターフェース
↑ の Asyncify.cpp に書かれている通り。
Asyncifyによって変換された関数は3つの実行モードを持つ。
-
0
通常実行 -
1
unwindingモード。Asyncifyされた関数から戻ってきたときにこのモードになっていたら、ローカル変数を保存した上で適当な値を返却して直ちにreturnする。 -
2
rewindingモード。呼ばれたときにこのモードになっていたら、ローカル変数をロードした上でスタック上に記録されたポイントまで実行済みの式をskipしながら戻る
vfork
→ execve
とか setjmp
→ longjmp
のような構造はasyncifyの提供する関数を使って実装できる。