!importantやめろ2018(自分が書いたUserStyleを見ながら
Ruby標準でrb_protect経由で任意のブロックを実行できそうな唯一のメソッドがfork()の子側の処理。なんでちょっと前に貼ったRuby本体のIssueにつながる。
多分結論。
Fiberはrb_protect()経由で呼ばれたブロックの中でFiber.yeildを呼ぶと件のエラーが発生する。
rb_protect()はCで書かれた拡張ライブラリから、Rubyのブロックを呼ぶときに使う(ブロックで例外が発生したら、rb_protect()の戻り値がエラーになる。rb_protectを挟まないと呼び出し元まで例外が伝搬する。begin~rescueみたいなもん)
mikutterでは、DelayerはGtk.idle_add_priority()のコールバックを利用して動いている。
そしてGtk.idle_add_priorityはrb_protectを使ってコールバックを呼んでる。
5万円が欲しいからと言うよりは、
https://dev.mikutter.hachune.net/issues/994
割と気になってたIssueだったのが大きいっす。 :manko:
もぐのさんにカレー5万円分送る準備をするか……
ruby-gnomeのrb_protect使ってるところを見っければ勝ちなのかも。
» Bug #2621: cannot resume Fiber from forked process - Ruby trunk - Ruby Issue Tracking System https://bugs.ruby-lang.org/issues/2621
CRuby読んで戻ってきたら、この一見遠そうなIssueが宝の山だったことに気づく。
https://twitter.com/gamou_neo/status/1043845933161562112
https://twitter.com/sugn74/status/1044150742880145409
これすき
rubyの核心に全然迫れない。
return ruby_current_execution_context_ptr;
ただのポインタだった。