[#31166] is_ruby_native_thread() — Masahiro Sakai (酒井政裕) <masahiro.sakai@...>

酒井です。

16 messages 2007/07/08
[#31269] Re: is_ruby_native_thread() — Nobuyoshi Nakada <nobu@...> 2007/07/21

なかだです。

[#31270] Re: is_ruby_native_thread() — Hidetoshi NAGAI <nagai@...> 2007/07/22

永井@知能.九工大です.

[#31298] retryの使い方 — eklerni <eklerni@...>

松尾といいます。

52 messages 2007/07/25
[#31299] Re: retryの使い方 — SASADA Koichi <ko1@...> 2007/07/26

 ささだです。

[#31300] Re: retryの使い方 — eklerni <eklerni@...> 2007/07/26

松尾です、返信ありがとうございます。

[#31303] Re: retryの使い方 — Yugui <yugui@...> 2007/07/26

Yuguiといいます。

[#31306] Re: retryの使い方 — eklerni <eklerni@...> 2007/07/26

松尾といいます。

[#31308] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/07/26

In article <46A909DD.1070405@for.mail-box.ne.jp>,

[#31310] Re: retryの使い方 — eklerni <eklerni@...> 2007/07/26

Tanaka Akira さんは書きました:

[#31314] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/07/30

In article <46A92530.80507@for.mail-box.ne.jp>,

[#31315] Re: retryの使い方 — eklerni <eklerni@...> 2007/07/30

Tanaka Akira さんは書きました:

[#31316] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/07/30

In article <46AD7A16.8080509@for.mail-box.ne.jp>,

[#31317] Re: retryの使い方 — eklerni <eklerni@...> 2007/07/31

松尾です。

[#31381] Re: retryの使い方 — SASADA Koichi <ko1@...> 2007/08/12

 ささだです。

[#31422] Re: retryの使い方 — Yukihiro Matsumoto <matz@...> 2007/08/15

まつもと ゆきひろです

[#31425] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/08/15

In article <E1ILDTi-0005T6-Be@x31>,

[#31426] Re: retryの使い方 — Yukihiro Matsumoto <matz@...> 2007/08/15

まつもと ゆきひろです

[#31433] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/08/16

In article <E1ILKn6-0003Nv-0f@x31>,

[#31435] Re: retryの使い方 — Yukihiro Matsumoto <matz@...> 2007/08/16

まつもと ゆきひろです

[#31447] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/08/16

In article <E1ILVN9-0006xJ-7I@x31>,

[#31450] Re: retryの使い方 — Tanaka Akira <akr@...> 2007/08/17

In article <E1ILq4x-0002Bs-Lg@x31>,

[#31451] Re: retryの使い方 — Yukihiro Matsumoto <matz@...> 2007/08/17

まつもと ゆきひろです

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

From: "Vincent Isambart" <vincent.isambart@...>
Date: 2007-07-18 12:49:39 UTC
List: ruby-dev #31253
こんにちは、
バンサンです。

このメールはこの前、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を使ってる)パッチを添付したんです。でもこのパッチは本当に正しい直し方であるかどうか…わからないです。

Attachments (1)

thread_not_alive_anymore.patch (507 Bytes, text/x-diff)
Index: eval.c
===================================================================
--- eval.c	(revision 12679)
+++ eval.c	(working copy)
@@ -11826,6 +11826,12 @@
 {
 }
 
+static void
+rb_child_at_fork(void)
+{
+    time_thread_alive_p = 0;
+}
+
 void
 rb_thread_cancel_timer()
 {
@@ -11920,6 +11926,7 @@
 #ifdef _THREAD_SAFE
 	pthread_create(&time_thread, 0, thread_timer, 0);
         time_thread_alive_p = 1;
+        pthread_atfork(NULL, NULL, rb_child_at_fork);
 #else
 	rb_thread_start_timer();
 #endif

In This Thread

Prev Next