Bug #11237
closedサブスレッドがすべて終了するとメインスレッドが割り込まれる。
Description
https://github.com/ruby/ruby/pull/898 のほうでも報告してあるのですが、
サブスレッドがすべて終了するとメインスレッドが割り込まれます。
r37865 の変更でプロセス終了時にメインスレッドを一時的に止めて、
サブスレッドがすべて終了した時点でメインスレッドを立ち上げるように
変更されましたが、その影響でプロセス終了時以外でもサブスレッドがす
べて終了するとメインスレッドに rb_threadptr_interrupt で割り込みが
入るようになりました。
ruby 組み込みの sleep/read/write などは rb_thread_t.status を
見て status に変更がない場合は再度 sleep/read/write などを実行でき
るが、拡張ライブラリではその方法が使えません。そのためサブスレッド終了
時の割り込みなので再実行すべきか、スレッド終了時や Thread#kill による
割り込みなので素直に終了すべきか判断できないため、拡張ライブラリ側で
なんとかするということができませんでした。
そこで、プロセス終了時にはメインスレッドの rb_thread_t.status が THREAD_KILLED
になることを利用してプロセス終了時にのみメインスレッドに割り込みを入れるパッチ
を作りました。
https://github.com/kubo/ruby/commit/530575483c1ca69d0e3832f4be4c0c7d8fa272ac
Updated by kosaki (Motohiro KOSAKI) over 9 years ago
報告ありがとうございます。あとで見ます
Updated by kosaki (Motohiro KOSAKI) over 9 years ago
- Status changed from Open to Closed
Applied in changeset r50900.
- thread.c (thread_start_func_2): don't interrupt when last thread exit
unless main thread is already exited. Otherwise main thread could be
wrongly interrupted when it uses rb_thread_call_without_gvl(). Patch
by Takehiro Kubo. [Bug #11237][ruby-dev:49044][GH-898] - test/-ext-/gvl/test_last_thread.rb: new test for the above fix.
- ext/-test-/gvl/call_without_gvl/call_without_gvl.c: new ext for the
above test. - ext/-test-/gvl/call_without_gvl/extconf.rb: ditto.
Updated by kosaki (Motohiro KOSAKI) over 9 years ago
ご指摘のとおりだと思います。こちらで対応するテストを作成のうえ、コミットしました。
Updated by ngoto (Naohisa Goto) over 9 years ago
- Related to Bug #11265: deadlock on Solaris 10 since r50900 added
Updated by kubo (Takehiro Kubo) over 9 years ago
r50900 を 2.0.0, 2.1, 2.2 にバックポートしてもらえませんか?
Updated by nagachika (Tomoyuki Chikanaga) about 9 years ago
- Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED, 2.2: REQUIRED
実際の可否はともかく、要望があるということで Backport フィールドに REQUIRED を埋めました。
r50900 を入れると(おそらく潜在的には r50900 の有無とは関係なく必要なのだと思いますが) [Bug #11265] の対応も必要になってきて、こちらがそれなりのボリュームがあり頻繁に変更のある部位の修正なのでうまくマージできないかもしれません。その時はまた悩みます。 r50900 のみ入れるというのも有意義ではあると思います。
Updated by kubo (Takehiro Kubo) about 9 years ago
バックポートの要望をした者です。
拡張ライブラリ側での回避はできないのですが、拡張ライブラリを使う側での回避は可能なので、プライオリティ低めで大丈夫だと思います。メインスレッドで行っていたタスクを新規スレッドで実行するように書き換えれば良いだけなので。
直っているリリースが欲しいのはやまやまなのですが、次の TEENY リリースと 2.3 のリリースの時間差が1,2ヶ月程度なら 2.3 を待ちます。