Bug #4285 » timeout.rb.diff
timeout.rb 2011-01-17 18:35:28.976375000 +0100 | ||
---|---|---|
#
|
||
# Copyright:: (C) 2000 Network Applied Communication Laboratory, Inc.
|
||
# Copyright:: (C) 2000 Information-technology Promotion Agency, Japan
|
||
require 'thread'
|
||
module Timeout
|
||
# Raised by Timeout#timeout when the block times out.
|
||
class Error < RuntimeError
|
||
... | ... | |
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?
|
||
end
|
||
m = Mutex.new
|
||
m.synchronize {
|
||
y = Thread.start {
|
||
m.synchronize {} # ensure variable y is pointing to the thread
|
||
# before y starts the timer
|
||
begin
|
||
sleep sec
|
||
rescue => e
|
||
x.raise e
|
||
else
|
||
x.raise exception, "execution expired" if x.alive?
|
||
end
|
||
}
|
||
}
|
||
return yield(sec)
|
||
rescue exception => e
|