From: nobu.nakada@... Date: 2002-09-26T10:03:17+09:00 Subject: [ruby-dev:18385] Re: rubicon on EWS4800 なかだです。 At Thu, 26 Sep 2002 09:20:15 +0900, Yukihiro Matsumoto wrote: > |> deadlock 0x1bc9d0: 2:0 - TestThreadGroup.rb:26 > | > |しかし、2:8ってなんだっけ、と思ってもeval.c見ないと意味が分かん > |ないですね。せめてこれくらいは。 > > |--- eval.c 25 Sep 2002 07:03:01 -0000 1.335 > |+++ eval.c 25 Sep 2002 23:33:27 -0000 > > このほうが親切ですね。コミットしてください。 もうちょっと親切にしてみました。バックトレースでもスレッドIDと かは出ないんで。 そういえばWAIT_PIDって今使ってないんですね。Process#waitpidでも ポーリングしてるし。 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 26 Sep 2002 00:10:41 -0000 @@ -7799,10 +7799,15 @@ static void rb_thread_deadlock() { + char msg[21+SIZEOF_LONG*2]; + VALUE e; + + sprintf(msg, "Thread(0x%lx): deadlock", curr_thread->thread); + e = rb_exc_new2(rb_eFatal, msg); if (curr_thread == main_thread) { - rb_raise(rb_eFatal, "Thread: deadlock"); + rb_exc_raise(e); } curr_thread = main_thread; th_raise_argc = 1; - th_raise_argv[0] = rb_exc_new2(rb_eFatal, "Thread: deadlock"); + th_raise_argv[0] = e; th_raise_node = ruby_current_node; rb_thread_restore_context(main_thread, RESTORE_RAISE); @@ -8071,7 +8076,15 @@ 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:", + th->thread, thread_status_name(th->status)); + if (th->wait_for & WAIT_FD) fprintf(stderr, "F(%d)", th->fd); + if (th->wait_for & WAIT_SELECT) fprintf(stderr, "S"); + if (th->wait_for & WAIT_TIME) fprintf(stderr, "T(%f)", th->delay); + if (th->wait_for & WAIT_JOIN) + fprintf(stderr, "J(0x%lx)", th->join ? th->join->thread : 0); + if (th->wait_for & WAIT_PID) fprintf(stderr, "P"); + if (!th->wait_for) fprintf(stderr, "-"); + fprintf(stderr, " %s - %s:%d\n", + th==main_thread ? "(main)" : "", th->node->nd_file, nd_line(th->node)); } @@ -8296,7 +8309,9 @@ rb_thread_join(th, limit) if (!rb_thread_dead(th)) { if (th == curr_thread) - rb_raise(rb_eThreadError, "thread tried to join itself"); + rb_raise(rb_eThreadError, "thread 0x%lx tried to join itself", + th->thread); if ((th->wait_for & WAIT_JOIN) && th->join == curr_thread) - rb_raise(rb_eThreadError, "Thread#join: deadlock - mutual join"); + rb_raise(rb_eThreadError, "Thread#join: deadlock 0x%lx - mutual join(0x%lx)", + curr_thread->thread, th->thread); if (curr_thread->status == THREAD_TO_KILL) last_status = THREAD_TO_KILL; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦