Backport #5155

[BUG] pthread_cond_signal: Resource temporarily unavailable (EAGAIN)

Added by Kenta Murata over 2 years ago. Updated over 2 years ago.

Assignee:Yuki Sonoda


1.9.2p290 に で公開したパッチを当て、
gcc-4.2 を使ってビルドした ruby を使用しています。

[BUG] pthreadcondsignal: Resource temporarily unavailable (EAGAIN)

止まる原因は、プロセスが長時間 (だいたい1日以上) ブロックされ続けた後、入力やシグナルを受け取って再度動き始めるタイミングです。

trunk で起きるかどうかも、まだ調べておりません。

Related issues

Duplicated by Backport92 - Backport #5205: Long-running Ruby process hit EAGAIN in Ruby 1.9.2 as it ... Assigned 08/20/2011


#1 Updated by Kenta Murata over 2 years ago

#5074 でバックポート要請されているコミット (関数の引き数に volatile を付ける) をバックポートし、
コンパイラを gcc-4.2 を優先して使うようにするパッチを に当てているだけです。

ですから、ほとんど 1.9.2p290 と同じものだと考えて良いと思います。

#2 Updated by Motohiro KOSAKI over 2 years ago

Snow Leopardのpthreadcondsignal()にはEAGAINを返すルートがないようなんですが、Lionから1つ出来てますね。


pthreadcondsignalthreadnp(pthreadcondt ocond, pthreadt thread)
if (((thread == 0) && (is
seqhigher((ucntval & PTHRWCOUNTMASK), (lcntval & PTHRWCOUNTMASK)))) || isseqhigher((scntval & PTHRWCOUNTMASK), (lcntval & PTHRWCOUNT_MASK))) {
since ucntval may be newer, just redo */
if (retry
count > 8192) {
} else {
goto retry;

8000回リトライしたら諦めてEAGAINという驚愕のコードに見えるので、たんにEAGAIN帰ってきたらもう一回 pthreadcondsignal()

#3 Updated by Yui NARUSE over 2 years ago

man ちゃんと更新しとけと Apple に Problem ID: 9894106 として報告しておきました。

On Mac OS X 10.7 Lion, pthreadcondsignal(3) may return EAGAIN but man doesn't describe it.

Steps to Reproduce:
See pthreadcondsignalthreadnp of
It is called by pthreadcondsignal and may returns EAGAIN.
But man
doesn't describe it.
Note that Snow Leopard doesn't return EAGAIN.

#4 Updated by Kenta Murata over 2 years ago


#5 Updated by Motohiro KOSAKI over 2 years ago



#6 Updated by Kenta Murata over 2 years ago

trunk と ruby19_3 ブランチに取り込みます。
その後、このチケットを 1.9.2 向けの Backport に移行させます。

#7 Updated by Kenta Murata over 2 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r32846.
Kenta, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

  • threadpthread.c (nativecondsignal): retry to call pthreadcondsignal and pthreadcondbroadcast if they return EAGAIN in nativecondsignal and nativecond_broadcast, respectively. It is for the pthread implementation of Mac OS X 10.7 (Lion). fixes #5155. .
  • threadpthread.c (nativecond_broadcast): ditto.
  • threadpthread.c (struct cachedthreadentry): stop using pthreadcond_t and its functions directly.
  • threadpthread.c (registercachedthreadand_wait): ditto.
  • threadpthread.c (usecached_thread): ditto.

#8 Updated by Kenta Murata over 2 years ago

  • Tracker changed from Bug to Backport
  • Status changed from Closed to Assigned
  • Assignee set to Yuki Sonoda

1.9.2 へのバックポートも必要です。1.9.2 向けのパッチは gist に置きました。

#9 Updated by Yui NARUSE over 2 years ago

  • Project changed from ruby-trunk to Backport92
  • Category changed from core to core
  • Target version deleted (1.9.2)
  • Parent task deleted (#5076)

Also available in: Atom PDF