前回ようやく心綺楼の解析に目処が付いたので、th135_ai(仮)開発に向けてライブラリの選定などをしていました。
その関係でmrubyに触れる機会があったのですが、いつもの様にマイクロスレッドもどきを作ってみたところ、200回以上resumuするとクラッシュというよくわからない事態に遭遇。
最初は自分のコードにバグがあるかと思ったのですが、最小再現コードを作ってみればrubyコードだけでクラッシュしていることが判明。
どうやらmrubyのバグを踏んだようです。
というわけで報告して来ました。
https://github.com/mruby/mruby/issues/1434
最小再現コード
t = Fiber.new do while true do 1.times do Fiber.yield end end end while true do [t].each do |t| t.resume end end
無意味そうなwhileやtimesがありますが、削ると発生しなくなります、謎。
windows8.1 previewという非正規な環境ではありますが、発生率は100%
mruby.exeで発生するので、自作コードによるものではないことは確実。
原因は何なんでしょうね?
Fiberによる状態の保存と復帰処理が、ある程度以上複雑なコールスタック上で行われると壊れるとかですかね?
まぁどっちにしろ、これで転けられるとマイクロスレッド中毒な自分からしたら話にならないので
すぐ治るようでなければ、th135_aiでは別言語を採用しないといけなそうです。
何がいいだろう、個人的にはSquirrelとかLuaの貧弱さが気に入らないので
もっと高機能の載せたいんですが、そうすると今度は組み込みコスト高くてなぁ……
まぁ次はpythonでも試してみましょうかね。
追記:作者さんからリプ飛んできて速攻直りました。
Matzさんすごいなー。