原です。 > thread_schedule()関数にprintfをいれてデバッグするしかないん > でしょうけど….変数nextの値が0なのが原因なんですよねえ.ど > うしよう. > > まつもと ゆきひろ /:|) eval.c にあっちこっち printf を入れて見たんですが、わかりませんでした。 どうも挙動不審です。 thread_schedule() の select の前後に > Counter++; > printf("%02d)BEFORE select: next = %d, n = %d\n", Counter, next, n); n = select(max+1, &readfds, NULL, NULL, delay_ptr); > printf("%02d)AFTER select: next = %d, n = %d\n", Counter, next, n); をいれ、問題の Fatal のあとに if (!next) { Fatal("Thread: deadlock"); } > printf("NEXT\n"); として ------------------^ tsvr.rb require "socket" require "thread" gs = TCPserver.open(0) addr = gs.addr addr.shift $stderr.printf("server is on %d\n", addr.join(":")) while TRUE ns = gs.accept $stderr.print(ns, " is accepted\n") Thread.start do s = ns while TRUE sleep 1 end $stderr.print(s, " is gone\n") s.close end end ------------------$ tsvr.rb を動かして、telnet でアクセスしたログです。 ------------------^ pizzicato:~/ruby-0.99.2-961007# ./ruby tsvr.rb server is on 2172 #<TCPsocket:0x9e1c4> is accepted NEXT 01)BEFORE select: next = 488192, n = 10858100 01)AFTER select: next = 488192, n = 0 NEXT 02)BEFORE select: next = 0, n = 10855648 03)BEFORE select: next = 0, n = 48 03)AFTER select: next = 0, n = 0 04)BEFORE select: next = 488192, n = 0 04)AFTER select: next = 488192, n = 0 NEXT 04)AFTER select: next = 0, n = -1 05)BEFORE select: next = 0, n = -1 06)BEFORE select: next = 488192, n = 0 06)AFTER select: next = 488192, n = 0 NEXT 06)AFTER select: next = 0, n = -1 07)BEFORE select: next = 487680, n = -4 07)AFTER select: next = 487680, n = 0 NEXT tsvr.rb:16:in `sleep': Thread: deadlock ------------------$ なんで select の前後で突然ジャンプするのだろう?(^^; Shin-ichro Hara(Nagaoka Univ.of Tech.)