いけむランド

はてダからやってきました

Re: ruby master (x86_64-cygwin) がセグっててどうしよう

なんかいろいろ調べてたら解決したっぽい。

fd0.hatenablog.jp

明らかに Cygwin でしか発生しないことから、#if defined(__CYGWIN__) まわりのコードを雑に grep して追っていたら、Cygwin の時だけ初期化されてなさそうなコードを見つけて、試しに取り除いたら、あっさり解消してしまった。

github.com

挙動としては GC が発生すると、そのあとに明らかにおかしいアドレスへのアクセスで SIGSEGV を吐くため、辻褄があってなくもないかなというくらいの気持ちではあったが、とはいえ正直「何故かセグらなくなります」とだけ書いた PR を出しても、理由を説明できないから絶対 merge されないよなと思って、追加でいろいろ調べてた。

こういう時はだいたい blame で歴史を遡っていくけど、運良くきちんと Cygwin 向けの分岐が生まれた理由が見つかった。

github.com

この commit がされた 2010 年の時点で Cygwin の Signal Stack まわりの挙動が中途半端な (& SIGSEGV が発生する) ため、Cygwin の場合だけ native_thread_init_stack を call しないようにしたとのことであった。

一方で今は SIGSEGV が起きなくなっているから、SIgnal Stack はきちんと動いているのでは?ということで Cygwin 側の実装を追っていたら、2015 年に実装したよという commit があった。

github.com

以上より他のプラットフォームと同じ処理をさせても問題なさそうということで PR を作成したという流れ。