[#43465] GVL改善案 — KOSAKI Motohiro <kosaki.motohiro@...>
小崎です
[#43467] [Q] thread->interrupt_flag が適切に排他制御されていないように見える — KOSAKI Motohiro <kosaki.motohiro@...>
kosakiです
ささだです.
> ささだです.
ささだです.
> ささだです.
自己解決しました
ささだです.
>> ということは危ないのは RUBY_VM_SET_INTERRUPT() がロストしたときに、タイムアウトなしの
>>> ということは危ないのは RUBY_VM_SET_INTERRUPT() がロストしたときに、タイムアウトなしの
[#43468] Re: [ruby-changes:19438] Ruby:r31478 (trunk): * test/date/*.rb: use skip /w messages. — KOSAKI Motohiro <kosaki.motohiro@...>
2011/5/8 tadf <ko1@atdot.net>:
> 表示したい場合を除いてはskipよりもreturnを使うようお願いしています。
>> 表示したい場合を除いてはskipよりもreturnを使うようお願いしています。
[#43476] [Ruby 1.9 - Feature #4653][Open] [PATCH 1/1] new method Enumerable#rude_map — Shyouhei Urabe <shyouhei@...>
遠藤です。
(05/08/2011 11:21 PM), Yusuke ENDOH wrote:
遠藤です。
卜部です。
At Mon, 9 May 2011 16:35:31 +0900,
遠藤です。
[#43493] [Ruby 1.9 - Feature #4657][Open] add option to hide skip messages on unit/test — Shota Fukumori <sorah@...>
> -q, --hide-skipでskipメッセージが表示されなくなります。
(05/09/2011 06:31 PM), Shota Fukumori wrote:
> (05/09/2011 06:31 PM), Shota Fukumori wrote:
2011/5/9 KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>:
> 2011/5/9 KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>:
[#43502] draft schedule of Ruby 1.9.3 — "Yuki Sonoda (Yugui)" <yugui@...>
-----BEGIN PGP SIGNED MESSAGE-----
Hi
Hello,
(ruby-coreはずしました)
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
[#43549] RubyKaigi2011に'CRuby'コミッタの皆さまを招待いたします(締切:2011-06-15) — Kakutani Shintaro <shintaro.kakutani@...>
'CRuby'コミッタの皆さまへ
[#43554] [Ruby 1.9 - Bug #4696][Assigned] thread.c#lock_func() が spurious wakeup unsafe — Motohiro KOSAKI <kosaki.motohiro@...>
[#43606] [Ruby 1.9 - Bug #4808][Open] thread_wait_for() eats 100% of CPU power — Hidetoshi Nagai <nagai@...>
> いつからかは把握できていませんが (少なくとも 1.9.2p0 では発生しません),
[ruby-dev:43486] Re: [Q] thread->interrupt_flag が適切に排他制御されていないように見える
> ささだです.
>
> (2011/05/08 20:23), KOSAKI Motohiro wrote:
> > Ruby VM internal
> > に詳しい方々に質問です。現在、thread->interrupt_flagはどうやって排他制御されるデザインになっていますでしょうか?
>
> 詳しいかどうかは疑問ですが,th->interrupt_flag を作りました.
そういうのを詳しい人というのです :-)
>
> 基本的に,th->interrupt_flag を弄る人は GVL 取ってるので,排他制御出来
> てると思ってたんだけど,まずい?
timer threadさんがとってなくて、彼にはGVLを取るという選択肢はなさそうだ。
というのが first impression でした。
> GVL 取ってないのは timer_thread だけど,timer_thread が設定する時
> に,or を設定しようとして,そこでまずいことが起こる可能性があるのか
> な.timer_thread_lock ってのも,昔は取っていなかったような(覚えていない).
>
> timer_thread の flag は,実は lost してもあんまり問題ない(ちょっとス
> ケジューリングが遅れるだけ)ってんで現在の仕様にしている(ロックを取らな
> い)のですが,他が設定したものを reset してしまう可能性がある(具体的に
> は signal 回りとバッティングする),といのはまずいかもしれませんね.どう
> しよ.
はい、わたしが心配していたのは後者の方です。
>
> (1) 落としてもまぁ巡り巡って何とかなる系と,(2) 落としちゃいけない系を
> 分けますかねえ.
>
> (1)
> #define RUBY_VM_SET_TIMER_INTERRUPT(th) ((th)->interrupt_flag |= 0x01)
> #define RUBY_VM_SET_FINALIZER_INTERRUPT(th) ((th)->interrupt_flag |= 0x04)
>
> (2)
> #define RUBY_VM_SET_INTERRUPT(th) ((th)->interrupt_flag |= 0x02)
わたしは timer interrupt だけ分けるのも、ありだと思いましたがどうでしょうか。
理由は
1)タイマースレッドだけがGVLを持つことが無理
2)タイマー割り込みだけは、どんな状況でもロストしても大事故は起きない
の2つの特殊性があるからです。好都合なことに、タイマースレッドの cond_timedwait
がtimer_lockを暗にreleaseし、そこでrelease barrierが張られるので、
> 今気づきましたが,結局「ちょっとシグナル配送が遅れる」だけなので,全部
> (1) に分類してもいいような気がしてきました.なので,現状は「大きな問題は
> 起きないのではないか」派.
こちらは理解が追いつかなかったので補足をお願いして良いですか?
RUBY_VM_SET_INTERRUPT() がロストしたときに、後からフラグを立て直してくれる人は
どなたでしょうか?
たとえば、 thread.c#do_selectには以下のループがありますが
#if defined(__CYGWIN__) || defined(_WIN32)
(snip)
BLOCKING_REGION({
do {
result = rb_fd_select(n, read, write, except, wait);
(snip)
}
} while (__th->interrupt_flag == 0);
}, 0, 0);
この場合、interrupt_flag が0 だと Rubyの世界に戻ってきてくれなさそうですが、
大丈夫でしょうか?
また、タイマースレッドが定期的に起こしてくれるのはメインスレッドだけなので、
サブスレッドはRUBY_VM_CHECK_INTS() がfalseを返し続ける限り、
rb_threadptr_execute_interrupts_rec() まで来ないのではないのかという疑惑が
あるのですが、どのルートで担保されてますでしょうか?