Project

General

Profile

Backport #3170

timeout() does'nt work with Non Integer/Float Argument

Added by moro (Kyosuke MOROHASHI) over 9 years ago. Updated about 8 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
[ruby-dev:41011]

Description

=begin
Ruby 1.8.7p248で、timeout()の引数にIntegerやFloat以外のオブジェクトを渡すと、
何も起こらないままタイムアウトが効かなくなります。

あまり機会はありませんが、

  • Rational(mathnをrequireしたあと、1/2秒など指定すると困る)や、
  • ActiveSupport::Duration(10.secondsなどで返る)

でタイムアウト秒を指定する場合にはまってしまいます。

原因は、timeout()で作られる監視用スレッドyにて、sleepがTypeErrorを起こし、yがすぐに
終了してしまうのが原因だと思っています。

数値に変換できそうなオブジェクトの場合は、to_i/to_fしてsleepする挙動か、
もしくは明示的に例外があがるようになれば助かりますが、いかがでしょうか。

$ ruby -v -rtimeout -rrational -e 'timeout(Rational(1,2)){ sleep 3; p "slept" }'
ruby 1.8.7 (2009-12-24 patchlevel 248) [i686-darwin9]
"slept"

$ ruby19 -v -rtimeout -rrational -e 'timeout(Rational(1,2)){ sleep 3; p "slept!" }'
ruby 1.9.2dev (2009-09-25 trunk 25091) [i386-darwin9]
lib/rational.rb is deprecated
-e:1:in sleep': execution expired (Timeout::Error)
from -e:1:in
block in '
from -e:1:in `'
=end


Related issues

Related to Ruby master - Bug #3168: TypeError in Timeout.timeoutClosed04/19/2010Actions

History

#1

Updated by moro (Kyosuke MOROHASHI) over 9 years ago

=begin
[Bug #3168]で修正済みのものですね。すみません。
お手数をおかけしてすみませんが、閉じてください。
=end

#2

Updated by shyouhei (Shyouhei Urabe) almost 9 years ago

  • Status changed from Open to Closed

=begin

=end

Also available in: Atom PDF