From 171eef4f92ede9d1baeb16be31a61290855a66b5 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Wed, 8 Jun 2022 15:44:32 +0200 Subject: [PATCH] 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`. --- lib/timeout.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/timeout.rb b/lib/timeout.rb index aa9bcaf..95dd149 100644 --- a/lib/timeout.rb +++ b/lib/timeout.rb @@ -62,7 +62,7 @@ class Request 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 @@ def self.create_timeout_thread 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 @@ def self.ensure_timeout_thread_created 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