mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* Merge YARV
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
3e7566d8fb
commit
a3e1b1ce7e
233 changed files with 46004 additions and 13653 deletions
|
|
@ -1,24 +1,7 @@
|
|||
#--
|
||||
# = timeout.rb
|
||||
#
|
||||
# execution timeout
|
||||
#
|
||||
# = Copyright
|
||||
#
|
||||
# Copyright:: (C) 2000 Network Applied Communication Laboratory, Inc.
|
||||
# Copyright:: (C) 2000 Information-technology Promotion Agency, Japan
|
||||
#
|
||||
#++
|
||||
#
|
||||
# = Description
|
||||
#
|
||||
# A way of performing a potentially long-running operation in a thread, and
|
||||
# terminating it's execution if it hasn't finished within fixed amount of
|
||||
# time.
|
||||
#
|
||||
# Previous versions of timeout didn't use a module for namespace. This version
|
||||
# provides both Timeout.timeout, and a backwards-compatible #timeout.
|
||||
#
|
||||
# = Synopsis
|
||||
#
|
||||
# require 'timeout'
|
||||
|
|
@ -26,27 +9,33 @@
|
|||
# # Something that should be interrupted if it takes too much time...
|
||||
# }
|
||||
#
|
||||
# = Description
|
||||
#
|
||||
# A way of performing a potentially long-running operation in a thread, and terminating
|
||||
# it's execution if it hasn't finished by a fixed amount of time.
|
||||
#
|
||||
# Previous versions of timeout didn't provide use a module for namespace. This version
|
||||
# provides both Timeout.timeout, and a backwards-compatible #timeout.
|
||||
#
|
||||
# = Copyright
|
||||
#
|
||||
# Copyright:: (C) 2000 Network Applied Communication Laboratory, Inc.
|
||||
# Copyright:: (C) 2000 Information-technology Promotion Agency, Japan
|
||||
|
||||
module Timeout
|
||||
|
||||
##
|
||||
# Raised by Timeout#timeout when the block times out.
|
||||
|
||||
class Error<Interrupt
|
||||
class Error < Interrupt
|
||||
end
|
||||
|
||||
##
|
||||
# Executes the method's block. If the block execution terminates before +sec+
|
||||
# seconds has passed, it returns true. If not, it terminates the execution
|
||||
# and raises +exception+ (which defaults to Timeout::Error).
|
||||
#
|
||||
# Note that this is both a method of module Timeout, so you can 'include
|
||||
# Timeout' into your classes so they have a #timeout method, as well as a
|
||||
# module method, so you can call it directly as Timeout.timeout().
|
||||
|
||||
# Note that this is both a method of module Timeout, so you can 'include Timeout'
|
||||
# into your classes so they have a #timeout method, as well as a module method,
|
||||
# so you can call it directly as Timeout.timeout().
|
||||
def timeout(sec, exception=Error)
|
||||
return yield if sec == nil or sec.zero?
|
||||
raise ThreadError, "timeout within critical session" if Thread.critical
|
||||
begin
|
||||
x = Thread.current
|
||||
y = Thread.start {
|
||||
|
|
@ -54,33 +43,28 @@ module Timeout
|
|||
x.raise exception, "execution expired" if x.alive?
|
||||
}
|
||||
yield sec
|
||||
# return true
|
||||
return true
|
||||
ensure
|
||||
y.kill if y and y.alive?
|
||||
end
|
||||
end
|
||||
|
||||
module_function :timeout
|
||||
|
||||
end
|
||||
|
||||
##
|
||||
# Identical to:
|
||||
#
|
||||
# Timeout::timeout(n, e, &block).
|
||||
#
|
||||
# Defined for backwards compatibility with earlier versions of timeout.rb, see
|
||||
# Timeout#timeout.
|
||||
|
||||
def timeout(n, e=Timeout::Error, &block) # :nodoc:
|
||||
def timeout(n, e = Timeout::Error, &block)
|
||||
Timeout::timeout(n, e, &block)
|
||||
end
|
||||
|
||||
##
|
||||
# Another name for Timeout::Error, defined for backwards compatibility with
|
||||
# earlier versions of timeout.rb.
|
||||
|
||||
TimeoutError = Timeout::Error # :nodoc:
|
||||
TimeoutError = Timeout::Error
|
||||
|
||||
if __FILE__ == $0
|
||||
p timeout(5) {
|
||||
|
|
@ -102,4 +86,3 @@ if __FILE__ == $0
|
|||
}
|
||||
}
|
||||
end
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue