From: Tomoyuki Chikanaga Date: 2011-06-24T23:10:36+09:00 Subject: [ruby-dev:43894] [Ruby 1.9 - Bug #4072] dRubyで作成したサーバプログラムがsleepしていてもexitしてしまう Issue #4072 has been updated by Tomoyuki Chikanaga. File sleep_forever.patch added > RUBY_VM_CHECK_INTS() を抜けた後で th->status が THREAD_RUNNABLE になっていることがあるようで この原因は rb_threadptr_check_signal() でタイマースレッドがメインスレッドの status を変更しているためではないかと思います。 mth->status = THREAD_RUNNABLE にセットしてから rb_threadptr_interrupt() でメインスレッドへシグナル送信して元の status に戻していますが、戻す前にメインスレッドが rb_threadptr_execute_interrupts_rec() 内で th->status のバックアップを取ってしまうと誤って THREAD_RUNNABLE に遷移してしまいます。 status の変更は割り込みを受けとったスレッドでやっているので rb_threadptr_check_signal() では必要ないのではないかと思います。 添付のパッチのように変更すると sleep から起きないようになりました。どうでしょうか。 ---------------------------------------- Bug #4072: dRubyで作成したサーバプログラムがsleepしていてもexitしてしまう http://redmine.ruby-lang.org/issues/4072 Author: 三村 益隆 Status: Open Priority: Normal Assignee: Category: core Target version: 1.9.2 ruby -v: - =begin ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.4.0]にて、 dRubyを以下のようなserverとclient作成し、server->clientを実行すると、 serverプログラムが例外の表示もなくexitします。 ruby 1.9.3dev (2010-11-19 trunk 29830) [x86_64-darwin10.5.0]でも同様に発生します。 ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin10.4.0]では、 exitされないことを確認しております。 https://gist.github.com/706260 * serverプログラム require 'drb' class Hello def hello(message) puts message end end begin DRb.start_service('druby://:12346', Hello.new) puts DRb.uri sleep rescue Object, SystemExit=> e p e.backtrace raise e rescue => e puts e end * clientプログラム require 'drb' d = DRbObject.new_with_uri('druby://m-mimura-4.local:12346') d.hello "message" =end -- http://redmine.ruby-lang.org