summaryrefslogtreecommitdiff
path: root/ruby_1_8_6/lib/timeout.rb
diff options
context:
space:
mode:
Diffstat (limited to 'ruby_1_8_6/lib/timeout.rb')
-rw-r--r--ruby_1_8_6/lib/timeout.rb105
1 files changed, 105 insertions, 0 deletions
diff --git a/ruby_1_8_6/lib/timeout.rb b/ruby_1_8_6/lib/timeout.rb
new file mode 100644
index 0000000000..dc92964c0b
--- /dev/null
+++ b/ruby_1_8_6/lib/timeout.rb
@@ -0,0 +1,105 @@
+#--
+# = 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'
+# status = Timeout::timeout(5) {
+# # Something that should be interrupted if it takes too much time...
+# }
+#
+
+module Timeout
+
+ ##
+ # Raised by Timeout#timeout when the block times out.
+
+ 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().
+
+ 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 {
+ 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
+
+##
+# 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:
+ 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:
+
+if __FILE__ == $0
+ p timeout(5) {
+ 45
+ }
+ p timeout(5, TimeoutError) {
+ 45
+ }
+ p timeout(nil) {
+ 54
+ }
+ p timeout(0) {
+ 54
+ }
+ p timeout(5) {
+ loop {
+ p 10
+ sleep 1
+ }
+ }
+end
+