[#43467] [Q] thread->interrupt_flag が適切に排他制御されていないように見える — KOSAKI Motohiro <kosaki.motohiro@...>

kosakiです

15 messages 2011/05/08
[#43482] Re: [Q] thread->interrupt_flag が適切に排他制御されていないように見える — SASADA Koichi <ko1@...> 2011/05/08

 ささだです.

[#43486] Re: [Q] thread->interrupt_flag が適切に排他制御されていないように見える — KOSAKI Motohiro <kosaki.motohiro@...> 2011/05/09

>  ささだです.

[#43487] Re: [Q] thread->interrupt_flag が適切に排他制御されていないように見える — SASADA Koichi <ko1@...> 2011/05/09

 ささだです.

[#43488] Re: [Q] thread->interrupt_flag が適切に排他制御されていないように見える — KOSAKI Motohiro <kosaki.motohiro@...> 2011/05/09

>  ささだです.

[#43489] Re: [Q] thread->interrupt_flag が適切に排他制御されていないように見える — KOSAKI Motohiro <kosaki.motohiro@...> 2011/05/09

自己解決しました

[#43500] Re: [Q] thread->interrupt_flag が適切に排他制御されていないように見える — SASADA Koichi <ko1@...> 2011/05/09

 ささだです.

[#43501] Re: [Q] thread->interrupt_flag が適切に排他制御されていないように見える — KOSAKI Motohiro <kosaki.motohiro@...> 2011/05/09

>> ということは危ないのは 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>:

8 messages 2011/05/08

[#43476] [Ruby 1.9 - Feature #4653][Open] [PATCH 1/1] new method Enumerable#rude_map — Shyouhei Urabe <shyouhei@...>

16 messages 2011/05/08

[#43493] [Ruby 1.9 - Feature #4657][Open] add option to hide skip messages on unit/test — Shota Fukumori <sorah@...>

11 messages 2011/05/09

[#43502] draft schedule of Ruby 1.9.3 — "Yuki Sonoda (Yugui)" <yugui@...>

-----BEGIN PGP SIGNED MESSAGE-----

23 messages 2011/05/09
[#43505] Re: draft schedule of Ruby 1.9.3 — "U.Nakamura" <usa@...> 2011/05/10

Hello,

[#43513] Re: draft schedule of Ruby 1.9.3 — KOSAKI Motohiro <kosaki.motohiro@...> 2011/05/10

(ruby-coreはずしました)

[#43587] [Ruby 1.9 - Feature #4788][Open] resolv.rb refactoring — Makoto Kishimoto <redmine@...>

15 messages 2011/05/27

[ruby-dev:43489] Re: [Q] thread->interrupt_flag が適切に排他制御されていないように見える

From: KOSAKI Motohiro <kosaki.motohiro@...>
Date: 2011-05-09 04:11:12 UTC
List: ruby-dev #43489
自己解決しました

>  あれ,そうだったっけ>メインスレッドだけ.そんなことないような.

これはただのうっかりなので、おいとくとして
(RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread) なので自明だった)

> いや、あの。補足をお願いして良いですか。の返事がこれだとESP能力を
> 要求されてる感じです。ボスケテ
> 
> 	static void
> 	timer_thread_function(void *arg)
> 	{
> 	    rb_vm_t *vm = GET_VM(); /* TODO: fix me for Multi-VM */
> 	
> 	    /* for time slice */
> 	    RUBY_VM_SET_TIMER_INTERRUPT(vm->running_thread);
> 	
> 	    /* check signal */
> 	    rb_threadptr_check_signal(vm->main_thread);
> 
> 	void
> 	rb_threadptr_check_signal(rb_thread_t *mth)
> 	{
> 	    int sig;
> 
> 	    /* mth must be main_thread */
> 
> 	    if (!mth->exec_signal && (sig = rb_get_next_signal()) > 0) {
> 	        enum rb_thread_status prev_status = mth->status;
> 	        thread_debug("main_thread: %s, sig: %d\n",
> 	                     thread_status_name(prev_status), sig);
> 	        mth->exec_signal = sig;
> 	        if (mth->status != THREAD_KILLED) mth->status = THREAD_RUNNABLE;
> 	        rb_threadptr_interrupt(mth);
> 	        mth->status = prev_status;
> 	    }
> 	}
> 
> なので、メインスレッドが定期的に rb_threadptr_interrupt()呼ばれてるのは
> 自明なんですが、他のスレッドはどこからでしょうか?

タイマースレッドがrunning thread に配送されて、rb_threadptr_execute_interrupts_rec()で

        /* signal handling */
        if (th->exec_signal) {
		(1)
        }

        /* exception from another thread */
        if (th->thrown_errinfo) {
		(2)
	}

        if (finalizer_interrupt) {
		(3)
            rb_gc_finalize_deferred();
        }

のようになっているから、(1)と(2)はRUBY_VM_INTERRUPTED()を使っていないのでセーフ。
(3)は次のgcの時にもう一回フラグが立つからセーフということですね?

ということは危ないのは RUBY_VM_SET_INTERRUPT() がロストしたときに、タイムアウトなしの
スリープをしていて、vm->running_thread にならないから、タイマースレッドに
起こして貰えないケースでしょうか?




In This Thread