From: Motohiro KOSAKI Date: 2011-06-24T12:34:51+09:00 Subject: [ruby-dev:43888] [Ruby 1.9 - Bug #4072] dRubyで作成したサーバプログラムがsleepしていてもexitしてしまう Issue #4072 has been updated by Motohiro KOSAKI. いま、Macのpthread_cond_wait()見てるんですが、 http://www.opensource.apple.com/source/Libc/Libc-594.9.4/pthreads/pthread_cond.c /* * Suspend waiting for a condition variable. * Note: we have to keep a list of condition variables which are using * this same mutex variable so we can detect invalid 'destroy' sequences. * If isconforming < 0, we skip the _pthread_testcancel(), but keep the * remaining conforming behavior.. */ __private_extern__ int _pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime, int isRelative, int isconforming) { (snip) } else { if (wait_res < 0) { if (errno == ETIMEDOUT) { return ETIMEDOUT; } else if (errno == EINTR) { /* ** EINTR can be treated as a spurious wakeup unless we were canceled. */ return 0; } return EINVAL; } return 0; } } と、関数の最後でEINTRを0に差し替える処理があるので、EINTRでリトライうんぬんは違うんじゃないかなぁ。 あと、sleepの実体であるsleep_timeval()は1.9.2の時代からすでに、最初に時間を測定しておいて、起きてくるたびに 時間を再測定、早く起床しすぎたと思ったらもう一度寝る。というロジックなので戻り値にはあんまり 依存してないはず。 まあ、再現しないなら閉じること自体には反対しませんが、気になったので。 ---------------------------------------- Bug #4072: dRubyで作成したサーバプログラムがsleepしていてもexitしてしまう http://redmine.ruby-lang.org/issues/4072 Author: 三村 益隆 Status: Closed Priority: Normal Assignee: Category: core Target version: 1.9.2 ruby -v: ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.4.0] =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