mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* array.c (rb_values_at): extract common procedure from
rb_ary_values_at. follow DRY principle. * re.c (match_values_at): values_at should understand ranges. * struct.c (rb_struct_values_at): ditto. * struct.c (inspect_struct): inspect format changed; add "struct " at the top. * sprintf.c (rb_f_sprintf): "%p" specifier for inspect output. (RCR#68) * eval.c (rb_mod_undef_method): allow "undef_method" to accept multiple arguments. (RCR#146) * lib/timeout.rb: put timeout in Timeout module. (RCR#121) [ruby-talk:61028] * re.c (match_groups): new method added. (RCR#139) * variable.c (rb_mod_const_of): should exclude constant defined in Object, unless retrieving constants of Object. * string.c (rb_str_new4): do not allocate new string if original is frozen or already have copy-on-write entry. [ruby-talk:74940] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4031 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
a11ab83884
commit
9d22a06ea0
13 changed files with 157 additions and 96 deletions
|
@ -23,25 +23,38 @@
|
|||
#
|
||||
# The time in seconds to wait for block teminatation.
|
||||
#
|
||||
# : [exception]
|
||||
#
|
||||
# The exception classs to be raised on timeout.
|
||||
#
|
||||
#=end
|
||||
|
||||
class TimeoutError<Interrupt
|
||||
module Timeout
|
||||
class Error<Interrupt
|
||||
end
|
||||
|
||||
def timeout(sec, exception=Error)
|
||||
return yield if sec == nil
|
||||
begin
|
||||
x = Thread.current
|
||||
y = Thread.start {
|
||||
sleep sec
|
||||
x.raise exception, "execution expired" if x.alive?
|
||||
}
|
||||
yield sec
|
||||
# return true
|
||||
ensure
|
||||
y.kill if y and y.alive?
|
||||
end
|
||||
end
|
||||
module_function :timeout
|
||||
end
|
||||
|
||||
def timeout(sec, exception=TimeoutError)
|
||||
return yield if sec == nil
|
||||
begin
|
||||
x = Thread.current
|
||||
y = Thread.start {
|
||||
sleep sec
|
||||
x.raise exception, "execution expired" if x.alive?
|
||||
}
|
||||
yield sec
|
||||
# return true
|
||||
ensure
|
||||
y.kill if y and y.alive?
|
||||
end
|
||||
# compatible
|
||||
def timeout(n, &block)
|
||||
Timeout::timeout(n, &block)
|
||||
end
|
||||
TimeoutError = Timeout::Error
|
||||
|
||||
if __FILE__ == $0
|
||||
p timeout(5) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue