事前に用意した部品たちを組み合わせて、!, receive(パターンマッチ・タイムアウト)などを実装した。pthread_cond_timedwait は使い方が難しいね。
早めにリモートプロセスを実装した方が良さそうだという感触を得ている。
実装の途中でマルチスレッド対応の漏れがあったのでこなしていく。
多いのが VM クラス内で static 変数を使っていた問題。
Object VM::callClosure1(Object closure, Object arg)
{
static Object applyCode[] = {
Object::makeRaw(Instruction::FRAME),
Object::makeInt(8),
Object::makeRaw(Instruction::CONSTANT),
Object::Undef,
Object::makeRaw(Instruction::PUSH),
Object::makeRaw(Instruction::CONSTANT),
Object::Undef,
Object::makeRaw(Instruction::CALL),
Object::makeInt(1),
Object::makeRaw(Instruction::HALT),
};
applyCode[3] = arg;
applyCode[6] = closure;
こんな感じ。命令列の一部を動的に変更してそこに jump するコード。
これがスレッド間で共有され書き変わると、とんでもない事故が起きる