From: nobu.nakada@... Date: 2002-09-26T08:55:33+09:00 Subject: [ruby-dev:18383] Re: rubicon on EWS4800 なかだです。 At Thu, 26 Sep 2002 05:28:13 +0900, Tanaka Akira wrote: > > Mswin32.dont/onlyにするよりもUnix.only/dontにすべきでしょう。 > > たしかに。でも only じゃなくて or_variant かな。 あ、dontの反対はonlyじゃないのか。 > > > thread は... なんだったかな。これを入れとかないと時々失敗していた覚え > > > があります。 > > > > ここでエラーになったのを見た覚えはないような気がします。 > (snip) > おそらく、 > > 1. main で Thread.new が動き、新しいスレッドができる(th とする) > 2. th で (Thread.stop に到達する前に) context switch がおきる > 3. main で t.wakeup が呼ばれるが th は run な状態なので変化なし > 4. main で t.join が呼ばれて th の終了を待つために th に context > switch される > 5. th で Thread.stop が実行され、これを起こすものはいないので deadlock > > という story だと思うんですが。 なるほど。Thread.stopの前にsleep 0を入れるとすぐ再現できました。 > (そうか、Thread.critical = false はいらなかったかな) いや、ないとjoinできません。criticalにするのは10.timesのループ ごとでいいと思いますが。 > deadlock 0x100fa8: 2:8 (main) - TestThreadGroup.rb:33 > deadlock 0x1bc9d0: 2:0 - TestThreadGroup.rb:26 しかし、2:8ってなんだっけ、と思ってもeval.c見ないと意味が分かん ないですね。せめてこれくらいは。 Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.335 diff -u -2 -p -r1.335 eval.c --- eval.c 25 Sep 2002 07:03:01 -0000 1.335 +++ eval.c 25 Sep 2002 23:33:27 -0000 @@ -8071,7 +8071,12 @@ rb_thread_schedule() curr_thread->node = ruby_current_node; FOREACH_THREAD_FROM(curr, th) { - fprintf(stderr, "deadlock 0x%lx: %d:%d %s - %s:%d\n", - th->thread, th->status, - th->wait_for, th==main_thread ? "(main)" : "", + fprintf(stderr, "deadlock 0x%lx: %s:%c%c%c%c%c %s - %s:%d\n", + th->thread, thread_status_name(th->status), + (th->wait_for & WAIT_FD ? 'F' : '-'), + (th->wait_for & WAIT_SELECT ? 'S' : '-'), + (th->wait_for & WAIT_TIME ? 'T' : '-'), + (th->wait_for & WAIT_JOIN ? 'J' : '-'), + (th->wait_for & WAIT_PID ? 'P' : '-'), + th==main_thread ? "(main)" : "", th->node->nd_file, nd_line(th->node)); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦