Bug #4283 ยป timeout-race-fix.patch
| lib/timeout.rb | ||
|---|---|---|
|
return yield(sec) if sec == nil or sec.zero?
|
||
|
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?
|
||
|
begin
|
||
|
x = Thread.current
|
||
|
y = Thread.start {
|
||
|
begin
|
||
|
sleep sec
|
||
|
rescue => e
|
||
|
x.raise e
|
||
|
else
|
||
|
x.raise exception, "execution expired"
|
||
|
end
|
||
|
}
|
||
|
return yield(sec)
|
||
|
ensure
|
||
|
if y
|
||
|
y.kill
|
||
|
y.join # make sure y is dead.
|
||
|
end
|
||
|
}
|
||
|
return yield(sec)
|
||
|
end
|
||
|
rescue exception => e
|
||
|
rej = /\A#{Regexp.quote(__FILE__)}:#{__LINE__-4}\z/o
|
||
|
(bt = e.backtrace).reject! {|m| rej =~ m}
|
||
| ... | ... | |
|
raise if klass # if exception class is specified, it
|
||
|
# would be expected outside.
|
||
|
raise Error, e.message, e.backtrace
|
||
|
ensure
|
||
|
if y and y.alive?
|
||
|
y.kill
|
||
|
y.join # make sure y is dead.
|
||
|
end
|
||
|
end
|
||
|
end
|
||