Backport #5155

[BUG] pthread_cond_signal: Resource temporarily unavailable (EAGAIN)

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

[ruby-dev:44342]
Status:Assigned
Priority:Normal
Assignee:Yuki Sonoda

Description

1.9.2p290 に http://d.hatena.ne.jp/mrkn/20110728/use_ruby_1_9_2_on_lion で公開したパッチを当て、
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

History

#1 Updated by Kenta Murata over 2 years ago

補足ですが、私のブログで公開しているパッチは、
#5074 でバックポート要請されているコミット (関数の引き数に volatile を付ける) をバックポートし、
コンパイラを gcc-4.2 を優先して使うようにするパッチを configure.in に当てているだけです。

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

#2 Updated by Motohiro KOSAKI over 2 years ago

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


int

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


8000回リトライしたら諦めてEAGAINという驚愕のコードに見えるので、たんにEAGAIN帰ってきたらもう一回 pthreadcondsignal()
するのがよさそう。リトライするときにusleep()するかどうかぐらいが悩みどころか

#3 Updated by Yui NARUSE over 2 years ago

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

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

Steps to Reproduce:
See pthreadcondsignalthreadnp of
http://www.opensource.apple.com/source/Libc/Libc-763.11/pthreads/pthread_cond.c
It is called by pthreadcondsignal and may returns EAGAIN.
But man http://www.opensource.apple.com/source/Libc/Libc-763.11/pthreads/pthread_cond_signal.3
doesn't describe it.
Note that Snow Leopard doesn't return EAGAIN.

#4 Updated by Kenta Murata over 2 years ago

https://gist.github.com/1124278

このようなパッチで如何でしょう?

#5 Updated by Motohiro KOSAKI over 2 years ago

このようなパッチで如何でしょう?

僕的にはOKです

#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 に置きました。
https://gist.github.com/1124278

#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