Open3

(skip)

ピン留めされたアイテム
okuokuokuoku

ちょっと方針変更:

  • AsyncifyのランタイムはWasmモジュール側に持たせる
  • vforksetjmp でほぼ同じルーチンを実装しておいて、 longjmp に相当する機能はrunnerから呼べるようにする

これで行けるんではないか。。

okuokuokuoku

vfork を実装するためには setjmp longjmp に相当する処理を実装する必要があるので渋々Asyncifyに対応する。

AsyncifyはWasmモジュールにかけられる"変換"の一種で、Binaryenに実装されている。

https://github.com/WebAssembly/binaryen/blob/20fe882b47c4b2570c70b2f9d82189c5b2144d03/src/passes/Asyncify.cpp#L18-L25

Asyncifyに変換されたWasm内の関数は任意のタイミングで中断(無理矢理return)できるようになり、さらに、無理矢理returnされたところまで途中の処理をskipしながら戻ることもできる。

okuokuokuoku

Asyncifyのインターフェース

↑ の Asyncify.cpp に書かれている通り。

Asyncifyによって変換された関数は3つの実行モードを持つ。

  • 0 通常実行
  • 1 unwindingモード。Asyncifyされた関数から戻ってきたときにこのモードになっていたら、ローカル変数を保存した上で適当な値を返却して直ちにreturnする。
  • 2 rewindingモード。呼ばれたときにこのモードになっていたら、ローカル変数をロードした上でスタック上に記録されたポイントまで実行済みの式をskipしながら戻る

vforkexecve とか setjmplongjmp のような構造はasyncifyの提供する関数を使って実装できる。

https://github.com/kripken/talks/blob/991fb1e4b6d7e4b0ea6b3e462d5643f11d422771/jmp.c