Forum: Ruby-dev [PATCH] Problem with ruby 1.8.6-p36 (and p39) on Tiger

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
7f19d1a3818a0a0c2f59ecba589bbf6b?d=identicon&s=25 Vincent Isambart (Guest)
on 2007-07-18 14:50
(Received via mailing list)
こんにちは、
バンサンです。

このメールはこの前、ruby-coreに(ruby-core:11584)英語で送ったんですけど、答えがなかったからruby-devに、今回日本語で、送ろうと思ったんです…

Mac OS Tiger(10.4)では、こういう問題があって:
% ruby -ve 'require "timeout" ; Timeout.timeout(5) { puts `df -h` }'
ruby 1.8.6 (2007-06-07 patchlevel 36) [i686-darwin8.10.1]
/usr/local/lib/ruby/1.8/timeout.rb:54: execution expired
(Timeout::Error)
        from /usr/local/lib/ruby/1.8/timeout.rb:56:in `timeout'
        from -e:1

patchlevel
39でも同じ問題が起こります。ですけど--disable-pthreadsをついたら、それとも1.8のブランチや1.8.6-p0では、問題は起こらないです。

もっと調べたら、済んでない関数はrb_thread_cancel_timer
(eval.c)。この関数は1.8.6-p36や-p39だけでproc_exec_v 
(process.h)に呼ばれてます。
そしてpthreadを使わない場合、この関数が空っぽになります

それでrb_thread_cancel_timerで実際に何が起こるのか、そしてどうしてTiger以外のOS(Linux,
Leopard…)でどうして問題が起こらないかを調べたんです。理由がTigerのバグであるみたいです。
実際にRubyのsystem()や``を使ったら起こるのがこういうこと:
*プロセスがフォルクされて、親が興味あることをしない。でも子は以下のことをする。
*timer
threadをkillするために、rb_thread_cancel_timerが呼ばれている。だけどこのプロセスはフォルクで作られてるから、timer
threadがない(forkは子ではcurrent
thread以外全てのthreadを殺す)。それで、子の変数のtime_threadが親のthreadを参照する。このthreadがこのプロセスのthreadでないから大部分のOSではrb_thread_cancel_timerのpthread_cancelとpthread_joinの両方も失敗する。けど、Tigerではpthread_cancelが成功すてpthread_cancelが永遠に待つ。


どうしてrb_thread_cancel_timerが呼ばれたかを調べたら(ruby-dev:30581)、これは消せないと思います。でもCのforkの子から直接呼ぶのもダメです。

このメールに小さい(pthread_atforkを使ってる)パッチを添付したんです。でもこのパッチは本当に正しい直し方であるかどうか…わからないです。
9d2f78236e45a335301ba1195026105d?d=identicon&s=25 Urabe Shyouhei (Guest)
on 2007-07-19 03:48
(Received via mailing list)
Vincent Isambart wrote:
> $B$3$s$K$A$O!"(B
> $B%P%s%5%s$G$9!#(B

$B$3$s$K$A$O!#(B

> $B$3$N%a!<%k$O$3$NA0!"(Bruby-core$B$K!J(Bruby-core:11584$B!K1Q8l$GAw$C$?$s$G$9$1(B
> $B$I!"Ez$($,$J$+$C$?$+$i(B ruby-dev$B$K!":#2sF|K\8l$G!"Aw$m$&$H;W$C$?$s$G$9!D(B

$BJV?.DI$$IU$$$F$J$/$F$4$a$s$J$5$$!#(Bruby-core:11584$B$K$O5$$E$$$F$$$F!"8!F$(B
$B$N7k2LAw$C$F$b$i$C$?%Q%C%A$GBg>fIW$=$&$G$9!#(B1.8.6$B%V%i%s%A$K:NMQ$7$h$&$H(B
$B$*$b$$$^$9!#$"$j$,$H$&$4$6$$$^$9!#(B
This topic is locked and can not be replied to.