From: Motohiro KOSAKI Date: 2011-08-04T08:46:58+09:00 Subject: [ruby-dev:44347] [Ruby 1.9 - Bug #5155] [BUG] pthread_cond_signal: Resource temporarily unavailable (EAGAIN) Issue #5155 has been updated by Motohiro KOSAKI. Snow Leopardのpthread_cond_signal()にはEAGAINを返すルートがないようなんですが、Lionから1つ出来てますね。 ----------------------------------------------------------------------------- int pthread_cond_signal_thread_np(pthread_cond_t *ocond, pthread_t thread) { (snip) if (((thread == 0) && (is_seqhigher((ucntval & PTHRW_COUNT_MASK), (lcntval & PTHRW_COUNT_MASK)))) || is_seqhigher((scntval & PTHRW_COUNT_MASK), (lcntval & PTHRW_COUNT_MASK))) { /* since ucntval may be newer, just redo */ retry_count++; if (retry_count > 8192) { return(EAGAIN); } else { sched_yield(); goto retry; } } ----------------------------------------------------------------------------- 8000回リトライしたら諦めてEAGAINという驚愕のコードに見えるので、たんにEAGAIN帰ってきたらもう一回 pthread_cond_signal() するのがよさそう。リトライするときにusleep()するかどうかぐらいが悩みどころか ---------------------------------------- Bug #5155: [BUG] pthread_cond_signal: Resource temporarily unavailable (EAGAIN) http://redmine.ruby-lang.org/issues/5155 Author: Kenta Murata Status: Open Priority: Normal Assignee: Category: core Target version: 1.9.2 ruby -v: ruby 1.9.2p290 (2011-07-09) [x86_64-darwin11.0.0] 1.9.2p290 に http://d.hatena.ne.jp/mrkn/20110728/use_ruby_1_9_2_on_lion で公開したパッチを当て、 gcc-4.2 を使ってビルドした ruby を使用しています。 長い時間起動しっぱなしにしてあるプロセスが何らかのタイミングで以下のメッセージを吐いて止まります。 [BUG] pthread_cond_signal: Resource temporarily unavailable (EAGAIN) 止まる原因は、プロセスが長時間 (だいたい1日以上) ブロックされ続けた後、入力やシグナルを受け取って再度動き始めるタイミングです。 まだ何も調査してませんが、一応報告しておきます。 trunk で起きるかどうかも、まだ調べておりません。 -- http://redmine.ruby-lang.org