From: Tietew Date: 2003-10-20T14:00:27+09:00 Subject: [ruby-dev:21639] load() blocks thread scheduling Tietew です。 以下のコードがタイムアウトしません。Ctrl+C も効かなくなります。 require 'timeout' timeout(60) { load 'block.rb' } --- block.rb loop { } --- loop { Thread.pass } にするとちゃんtスレッドが切り替わるので, こんな感じにすれば旨く動いていますが,修正がこれでいいか自信があ りません。 Index: eval.c =================================================================== RCS file: /src/ruby/eval.c,v retrieving revision 1.566 diff -p -u -2 -r1.566 eval.c --- eval.c 15 Oct 2003 06:00:57 -0000 1.566 +++ eval.c 20 Oct 2003 04:59:11 -0000 @@ -5748,5 +5748,5 @@ rb_load(fname, wrap) { VALUE tmp; - int state; + int state, allowed_ints; volatile ID last_func; volatile VALUE wrapper = 0; @@ -5805,4 +5805,5 @@ rb_load(fname, wrap) DEFER_INTS; + allowed_ints = 0; ruby_in_eval++; critical = rb_thread_critical; @@ -5812,9 +5813,12 @@ rb_load(fname, wrap) node = ruby_eval_tree; rb_thread_critical = critical; + allowed_ints = 1; + ALLOW_INTS; if (ruby_nerrs == 0) { eval_node(self, node); } } - ALLOW_INTS; + if(!allowed_ints) + ALLOW_INTS; ruby_frame->last_func = last_func; ruby_current_node = last_node; —[ Tietew ]—————————————————————————— メ : tietew@tietew.net / tietew@raug.net / tietew@masuclub.net ホペ: http://www.tietew.net/ Tietew Windows Lab. http://www.masuclub.net/ 鱒倶楽部 指紋: 26CB 71BB B595 09C4 0153 81C4 773C 963A D51B 8CAA