[#23717] error at TestDRbMServer (test/drb) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。どうしても原因がわからないので、報告だけ・・・

18 messages 2004/06/19
[#23718] Re: error at TestDRbMServer (test/drb) — nobu.nakada@... 2004/06/19

なかだです。

[#23719] Re: error at TestDRbMServer (test/drb) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/06/19

山本です。

[#23720] Re: error at TestDRbMServer (test/drb) — nobu.nakada@... 2004/06/19

なかだです。

[#23724] Re: error at TestDRbMServer (test/drb) — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2004/06/19

山本です。

[#23762] Ruby 1.8.2 to be released. — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

40 messages 2004/06/23

[#23784] URI() — Tanaka Akira <akr@...17n.org>

前から思っていたのですが、URI.parse("http://...") を URI("http://...")

19 messages 2004/06/25

[ruby-dev:23781] Thread critical でも timeout を使いたい

From: Tatsuki Sugiura <sugi@...>
Date: 2004-06-24 21:06:57 UTC
List: ruby-dev #23781
杉浦と申します。こんにちは。

現在のバージョンだと Thread.critical = true の状態で
timeout を呼ぶと、呼び出し元スレッドにに制御が戻ってこない
ので、必ずタイムアウトしてしまいます。

$ ruby -rtimeout -e '
  Thread.critical = true;
  timeout(5){ sleep(1)  };
  puts "end"
'
/usr/lib/ruby/1.8/timeout.rb:50:in `timeout': execution expired (Timeout::Error)
        from /usr/lib/ruby/1.8/timeout.rb:65:in `timeout'
        from -e:3

critical == true でもスイッチできる特殊なスレッドがあれば良いの
かも知れませんが、とりあえず他を全部止めて critical = false する
パッチを書いてみました。

出来れば取り込んでいただけないでしょうか。

-- 
Tatsuki Sugiura   mailto:sugi@nemui.org

--- lib/timeout.rb.orig	2004-06-24 02:58:29.000000000 +0900
+++ lib/timeout.rb	2004-06-25 05:50:30.000000000 +0900
@@ -36,7 +36,15 @@
   def timeout(sec, exception=Error)
     return yield if sec == nil or sec.zero?
     begin
+      stats = Hash.new
       x = Thread.current
+      c = Thread.critical
+      c and Thread.list.each {|t|
+        t == x and next
+        stats[t] = !t.stop?
+        t.stop
+      } 
+      Thread.critical = false
       y = Thread.start {
         sleep sec
         x.raise exception, "execution expired" if x.alive?
@@ -45,6 +53,8 @@
       #    return true
     ensure
       y.kill if y and y.alive?
+      Thread.critical = c
+      stats.each { |t, run_p| run_p and t.wakeup }
     end
   end
   module_function :timeout

In This Thread

Prev Next