小松です.

mswin32で[ruby-dev:10259]を走らせるとrb_thread_schedule()が
無限ループに陥ってしまいます.

rb_thread_start_0()でrb_thread_remove()が呼ばれてcurr_threadが
THREAD_KILLEDになった後,rb_thread_schedule()が呼ばれるのですが,
FOREACH_THREAD(th)はcurr_threadがリンクから外されているのため
停止条件が成り立たず,無限ループしていました.
FOREACH_THREAD_FROM(curr, th)にすると止まるようになりました.

あと,以下を変更しました.

o rb_abort()で,ruby_errinfoのチェックを!NIL_P()で行うようにしました.
o THREAD_ALLOC()でth->errinfoが2回代入されているのを削除しました.
o THREAD_ALLOC()でth->prevとth->nextの初期化が実行されるように
  なったので,rb_callcc()のth->prevとth->nextの初期化を削除しました.

--- ruby-1.6.2.dist/eval.c Mon Oct 16 18:13:15 2000 +++ ruby-1.6.2/eval.c Tue Oct 17 12:48:20 2000 @@ -3226,3 +3226,3 @@ rb_abort() { - if (ruby_errinfo) { + if (!NIL_P(ruby_errinfo)) { error_print(); @@ -7112,3 +7112,3 @@ rb_thread_schedule() if (errno == EINTR) goto again; - FOREACH_THREAD(th) { + FOREACH_THREAD_FROM(curr, th) { if (th->wait_for & WAIT_SELECT) { @@ -7125,3 +7125,3 @@ rb_thread_schedule() } - END_FOREACH(th); + END_FOREACH_FROM(curr, th); } @@ -7640,3 +7640,2 @@ rb_thread_abort_exc_set(thread, val) th->result = 0;\ - th->errinfo = Qnil;\ \ @@ -7661,3 +7660,3 @@ rb_thread_abort_exc_set(thread, val) th->tracing = 0;\ - th->errinfo = 0;\ + th->errinfo = Qnil;\ th->last_status = 0;\ @@ -8207,3 +8206,2 @@ rb_callcc(self) } - th->prev = th->next = 0; th->thread = curr_thread->thread; -- 小松克行 / Katsuyuki Komatsu <komatsu / sarion.co.jp>