From 1fc0c08694510e56672bcd5f6a044538467811be Mon Sep 17 00:00:00 2001 From: normal Date: Fri, 14 Oct 2016 01:48:52 +0000 Subject: [PATCH] webrick: use monotonic clock for timeouts The monotonic clock is immune to system time changes and a better option for implementing timing comparisons. * lib/webrick/utils.rb (TimeoutHandler): use monotonic clock (watch): ditto git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56417 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ lib/webrick/utils.rb | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index e6434a8ea4..fb7b8e123f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Oct 14 10:48:37 2016 Eric Wong + + * lib/webrick/utils.rb (TimeoutHandler): use monotonic clock + (watch): ditto + Thu Oct 13 19:41:32 2016 Nobuyoshi Nakada * io.c (copy_stream_body): use IO to write to copy to duplex IO. diff --git a/lib/webrick/utils.rb b/lib/webrick/utils.rb index eb3b907ecf..8b34b6654f 100644 --- a/lib/webrick/utils.rb +++ b/lib/webrick/utils.rb @@ -134,7 +134,8 @@ module WEBrick # +time+:: Timeout in seconds # +exception+:: Exception to raise when timeout elapsed def TimeoutHandler.register(seconds, exception) - instance.register(Thread.current, Time.now + seconds, exception) + at = Process.clock_gettime(Process::CLOCK_MONOTONIC) + seconds + instance.register(Thread.current, at, exception) end ## @@ -163,7 +164,7 @@ module WEBrick def watch to_interrupt = [] while true - now = Time.now + now = Process.clock_gettime(Process::CLOCK_MONOTONIC) wakeup = nil to_interrupt.clear TimeoutMutex.synchronize{