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: AS22989 208.118.235.0/24 X-Spam-Status: No, score=-2.3 required=3.0 tests=AWL,BAYES_00,URIBL_BLOCKED shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: dtas-all@80x24.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id C846B1F4F6 for ; Sun, 17 May 2015 01:37:07 +0000 (UTC) Received: from localhost ([::1]:35797 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YtnVr-0005pt-2s for dtas-all@80x24.org; Sat, 16 May 2015 21:37:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47704) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YtnVp-0005pn-CF for dtas-all@nongnu.org; Sat, 16 May 2015 21:37:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YtnVm-0003Nt-5w for dtas-all@nongnu.org; Sat, 16 May 2015 21:37:05 -0400 Received: from dcvr.yhbt.net ([64.71.152.64]:58057) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YtnVm-0003Nc-0O for dtas-all@nongnu.org; Sat, 16 May 2015 21:37:02 -0400 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 4E16A1F4F6; Sun, 17 May 2015 01:37:00 +0000 (UTC) From: Eric Wong To: Subject: [PATCH] use monotonic clock on Ruby 2.1+ Date: Sun, 17 May 2015 01:36:59 +0000 Message-Id: <1431826619-29354-1-git-send-email-e@80x24.org> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 64.71.152.64 Cc: Eric Wong X-BeenThere: dtas-all@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dtas-all-bounces+dtas-all=80x24.org@nongnu.org Sender: dtas-all-bounces+dtas-all=80x24.org@nongnu.org The monotonic clock is immune to stepping adjustments so it is more suitable for tracking elapsed time differences. Process.clock_gettime also generates less garbage on 64-bit systems due to the use of Flonum. --- bin/dtas-console | 3 ++- lib/dtas.rb | 12 ++++++++++++ lib/dtas/process.rb | 2 +- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/bin/dtas-console b/bin/dtas-console index 18fe7d2..9fa4d09 100755 --- a/bin/dtas-console +++ b/bin/dtas-console @@ -3,6 +3,7 @@ # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt) # # Note: no idea what I'm doing, especially w.r.t. curses +require 'dtas' require 'dtas/unix_client' require 'dtas/rg_state' require 'dtas/sigevent' @@ -135,7 +136,7 @@ begin Curses.addstr(current['command']) end - elapsed = Time.now.to_f - current['spawn_at'] + elapsed = DTAS.now - current['spawn_at'] if (nr = cur['current_initial']) && (current_format = current['format']) rate = current_format['rate'].to_f elapsed += nr / rate diff --git a/lib/dtas.rb b/lib/dtas.rb index 9fc7253..f11d549 100644 --- a/lib/dtas.rb +++ b/lib/dtas.rb @@ -1,6 +1,18 @@ # Copyright (C) 2013-2015 all contributors # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt) module DTAS # :nodoc: + # try to use the monotonic clock in Ruby >= 2.1, it is immune to clock + # offset adjustments and generates less garbage (Float vs Time object) + begin + ::Process.clock_gettime(::Process::CLOCK_MONOTONIC) + def self.now + ::Process.clock_gettime(::Process::CLOCK_MONOTONIC) + end + rescue NameError, NoMethodError + def self.now # Ruby <= 2.0 + Time.now.to_f + end + end end require_relative 'dtas/compat_onenine' diff --git a/lib/dtas/process.rb b/lib/dtas/process.rb index 5be107f..8c5e8e9 100644 --- a/lib/dtas/process.rb +++ b/lib/dtas/process.rb @@ -51,7 +51,7 @@ module DTAS::Process # :nodoc: pid = spawn(env, cmd, opts) warn [ :spawn, pid, cmd ].inspect if $DEBUG - @spawn_at = Time.now.to_f + @spawn_at = DTAS.now PIDS[pid] = self pid end -- EW