From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS8100 96.47.226.0/23 X-Spam-Status: No, score=-1.5 required=3.0 tests=BAYES_00,RCVD_IN_XBL shortcircuit=no autolearn=no version=3.3.2 X-Original-To: spew@80x24.org Received: from 80x24.org (wannabe.torservers.net [96.47.226.22]) by dcvr.yhbt.net (Postfix) with ESMTP id B04BE1F722 for ; Wed, 6 May 2015 22:29:45 +0000 (UTC) From: Eric Wong To: spew@80x24.org Subject: [PATCH] lib/*: use monotonic clock for timeouts Date: Wed, 6 May 2015 22:29:32 +0000 Message-Id: <1430951372-28813-1-git-send-email-e@80x24.org> List-Id: The monotonic clock is preferred as it is guaranteed to be continuous and not subject to jumps due to adjustments. * lib/net/resolv.rb (now): new method to use monotonic clock * lib/net/resolv.rb (request): use new now method * lib/net/http.rb (now): new method to use monotonic clock * lib/net/http.rb (begin_transport, end_transport): ditto --- lib/net/http.rb | 14 ++++++++++++-- lib/resolv.rb | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/lib/net/http.rb b/lib/net/http.rb index 2fc541c..58d4f65 100644 --- a/lib/net/http.rb +++ b/lib/net/http.rb @@ -1457,10 +1457,20 @@ module Net #:nodoc: raise exception end + if defined?(Process::CLOCK_MONOTONIC) + def now + Process.clock_gettime(Process::CLOCK_MONOTONIC) + end + else + def now + Process.clock_gettime(Process::CLOCK_REALTIME) + end + end + 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 < now D 'Conn close because of keep_alive_timeout' @socket.close connect @@ -1484,7 +1494,7 @@ module Net #:nodoc: @socket.close elsif keep_alive?(req, res) D 'Conn keep-alive' - @last_communicated = Time.now + @last_communicated = now else D 'Conn close' @socket.close diff --git a/lib/resolv.rb b/lib/resolv.rb index 9083bd0..c56bf32 100644 --- a/lib/resolv.rb +++ b/lib/resolv.rb @@ -666,8 +666,18 @@ class Resolv @socks = nil end + if defined?(Process::CLOCK_MONOTONIC) + def now + Process.clock_gettime(Process::CLOCK_MONOTONIC) + end + else + def now + Process.clock_gettime(Process::CLOCK_REALTIME) + end + end + def request(sender, tout) - start = Time.now + start = now timelimit = start + tout begin sender.send @@ -676,7 +686,7 @@ class Resolv raise ResolvTimeout end while true - before_select = Time.now + before_select = now timeout = timelimit - before_select if timeout <= 0 raise ResolvTimeout @@ -687,7 +697,7 @@ class Resolv select_result = IO.select(@socks, nil, nil, timeout) end if !select_result - after_select = Time.now + after_select = now next if after_select < timelimit raise ResolvTimeout end -- EW