From: SASADA Koichi Date: 2011-05-09T11:10:09+09:00 Subject: [ruby-dev:43487] Re: [Q] thread->interrupt_flag が適切に排他制御されていないように見える  ささだです. (2011/05/09 11:02), KOSAKI Motohiro wrote: > こちらは理解が追いつかなかったので補足をお願いして良いですか? > RUBY_VM_SET_INTERRUPT() がロストしたときに、後からフラグを立て直してくれる人は > どなたでしょうか?  ええと,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() まで来ないのではないのかという疑惑が > あるのですが、どのルートで担保されてますでしょうか?  あれ,そうだったっけ>メインスレッドだけ.そんなことないような. -- // SASADA Koichi at atdot dot net