summaryrefslogtreecommitdiff
path: root/lib/timeout.rb
diff options
context:
space:
mode:
authorJean Boussier <[email protected]>2022-06-08 15:44:32 +0200
committergit <[email protected]>2022-06-09 18:58:49 +0900
commit4e21b19a61aadd785df1d731d79265fef16fb7c8 (patch)
tree2696298d08a0bc1ee6e43d4c6d7a9f1a2b10aae5 /lib/timeout.rb
parentbda4d91f0599a8e2d278bc13660a5576d4ced353 (diff)
[ruby/timeout] Keep a private reference to `Process.clock_gettime`
`timeout 0.3.0` broke our test suite because we have some tests that stubs `Process.clock_gettime` making it return a value in the past, causing `Timeout` to trigger almost immediately. I beleive it wasn't a problem before because it was relying on `Process.sleep`. https://github.com/ruby/timeout/commit/e5911a303e
Diffstat (limited to 'lib/timeout.rb')
-rw-r--r--lib/timeout.rb10
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/timeout.rb b/lib/timeout.rb
index aa9bcaf100..95dd1490ae 100644
--- a/lib/timeout.rb
+++ b/lib/timeout.rb
@@ -62,7 +62,7 @@ module Timeout
def initialize(thread, timeout, exception_class, message)
@thread = thread
- @deadline = Process.clock_gettime(Process::CLOCK_MONOTONIC) + timeout
+ @deadline = GET_TIME.call(Process::CLOCK_MONOTONIC) + timeout
@exception_class = exception_class
@message = message
@@ -109,7 +109,7 @@ module Timeout
now = 0.0
QUEUE_MUTEX.synchronize do
- while (now = Process.clock_gettime(Process::CLOCK_MONOTONIC)) < closest_deadline and QUEUE.empty?
+ while (now = GET_TIME.call(Process::CLOCK_MONOTONIC)) < closest_deadline and QUEUE.empty?
CONDVAR.wait(QUEUE_MUTEX, closest_deadline - now)
end
end
@@ -134,6 +134,12 @@ module Timeout
end
end
end
+
+ # We keep a private reference so that time mocking libraries won't break
+ # Timeout.
+ GET_TIME = Process.method(:clock_gettime)
+ private_constant :GET_TIME
+
# :startdoc:
# Perform an operation in a block, raising an error if it takes longer than