From 16aeffefa2670d7d3317488a46f2cc4e1a93fac0 Mon Sep 17 00:00:00 2001 From: normal Date: Fri, 29 May 2015 01:40:26 +0000 Subject: [PATCH] lib/*: use monotonic clock for timeouts The monotonic clock is preferred as it is guaranteed to be continuous and not subject to jumps due to adjustments. * lib/net/resolv.rb (request): use monotonic clock * lib/net/http.rb (begin_transport, end_transport): ditto git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50664 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ lib/net/http.rb | 4 ++-- lib/resolv.rb | 6 +++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index c642a3328c..dc9efaf19e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri May 29 10:30:34 2015 Eric Wong + + * lib/net/resolv.rb (request): use monotonic clock + * lib/net/http.rb (begin_transport, end_transport): ditto + Fri May 29 04:37:38 2015 Koichi Sasada * ext/objspace/objspace.c: add two methods to debug internals. diff --git a/lib/net/http.rb b/lib/net/http.rb index 2fc541c2e8..4c1c3271ae 100644 --- a/lib/net/http.rb +++ b/lib/net/http.rb @@ -1460,7 +1460,7 @@ module Net #:nodoc: def begin_transport(req) if @socket.closed? connect - elsif @last_communicated && @last_communicated + @keep_alive_timeout < Time.now + elsif @last_communicated && @last_communicated + @keep_alive_timeout < Process.clock_gettime(Process::CLOCK_MONOTONIC) D 'Conn close because of keep_alive_timeout' @socket.close connect @@ -1484,7 +1484,7 @@ module Net #:nodoc: @socket.close elsif keep_alive?(req, res) D 'Conn keep-alive' - @last_communicated = Time.now + @last_communicated = Process.clock_gettime(Process::CLOCK_MONOTONIC) else D 'Conn close' @socket.close diff --git a/lib/resolv.rb b/lib/resolv.rb index 9083bd0b53..ce36acf01f 100644 --- a/lib/resolv.rb +++ b/lib/resolv.rb @@ -667,7 +667,7 @@ class Resolv end def request(sender, tout) - start = Time.now + start = Process.clock_gettime(Process::CLOCK_MONOTONIC) timelimit = start + tout begin sender.send @@ -676,7 +676,7 @@ class Resolv raise ResolvTimeout end while true - before_select = Time.now + before_select = Process.clock_gettime(Process::CLOCK_MONOTONIC) timeout = timelimit - before_select if timeout <= 0 raise ResolvTimeout @@ -687,7 +687,7 @@ class Resolv select_result = IO.select(@socks, nil, nil, timeout) end if !select_result - after_select = Time.now + after_select = Process.clock_gettime(Process::CLOCK_MONOTONIC) next if after_select < timelimit raise ResolvTimeout end