[前][次][番号順一覧][スレッド一覧]

ruby-changes:19582

From: kosaki <ko1@a...>
Date: Wed, 18 May 2011 20:32:08 +0900 (JST)
Subject: [ruby-changes:19582] kosaki:r31623 (trunk): * lib/timeout.rb (Timeout#timeout): don't leak "execution expired"

kosaki	2011-05-18 20:31:58 +0900 (Wed, 18 May 2011)

  New Revision: 31623

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31623

  Log:
    * lib/timeout.rb (Timeout#timeout): don't leak "execution expired"
      exception. [Bug #4283] [ruby-core:34534].

  Modified files:
    trunk/ChangeLog
    trunk/lib/timeout.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 31622)
+++ ChangeLog	(revision 31623)
@@ -1,3 +1,8 @@
+Wed May 18 20:25:04 2011  KOSAKI Motohiro  <kosaki.motohiro@g...>
+
+	* lib/timeout.rb (Timeout#timeout): don't leak "execution expired"
+	  exception. [Bug #4283] [ruby-core:34534].
+
 Wed May 18 06:09:24 2011  Eric Hodel  <drbrain@s...>
 
 	* lib/cmath.rb:  Add some examples and improve documentation.  Patch by
Index: lib/timeout.rb
===================================================================
--- lib/timeout.rb	(revision 31622)
+++ lib/timeout.rb	(revision 31623)
@@ -46,17 +46,24 @@
     return yield(sec) if sec == nil or sec.zero?
     exception = klass || Class.new(ExitException)
     begin
-      x = Thread.current
-      y = Thread.start {
-        begin
-          sleep sec
-        rescue => e
-          x.raise e
-        else
-          x.raise exception, "execution expired" if x.alive?
+      begin
+        x = Thread.current
+        y = Thread.start {
+          begin
+            sleep sec
+          rescue => e
+            x.raise e
+          else
+            x.raise exception, "execution expired"
+          end
+        }
+        return yield(sec)
+      ensure
+        if y
+          y.kill
+          y.join # make sure y is dead.
         end
-      }
-      return yield(sec)
+      end
     rescue exception => e
       rej = /\A#{Regexp.quote(__FILE__)}:#{__LINE__-4}\z/o
       (bt = e.backtrace).reject! {|m| rej =~ m}
@@ -68,11 +75,6 @@
       raise if klass            # if exception class is specified, it
                                 # would be expected outside.
       raise Error, e.message, e.backtrace
-    ensure
-      if y and y.alive?
-        y.kill
-        y.join # make sure y is dead.
-      end
     end
   end
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]