From 1652420484befa9465bf090614d26fd4976c6e81 Mon Sep 17 00:00:00 2001 From: Julien Portalier Date: Thu, 12 Oct 2017 16:11:58 +0200 Subject: [PATCH] Fix: don't lose monotonic clock precision on darwin --- src/crystal/system/unix/time.cr | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/crystal/system/unix/time.cr b/src/crystal/system/unix/time.cr index 69eeb9e3e6c2..3beff45696c2 100644 --- a/src/crystal/system/unix/time.cr +++ b/src/crystal/system/unix/time.cr @@ -49,9 +49,10 @@ module Crystal::System::Time def self.monotonic {% if flag?(:darwin) %} - info = mach_timebase_info - nanoseconds = LibC.mach_absolute_time.to_i64 * info.numer / info.denom - {nanoseconds / 1_000_000_000, nanoseconds.remainder(1_000_000_000).to_i32} + absolute_time = LibC.mach_absolute_time * mach_ticks_per_nanosecond + seconds = absolute_time / 1_000_000_000 + nanoseconds = absolute_time.remainder(1_000_000_000) + {seconds.to_i64, nanoseconds.to_i32} {% else %} if LibC.clock_gettime(LibC::CLOCK_MONOTONIC, out tp) == 1 raise Errno.new("clock_gettime(CLOCK_MONOTONIC)") @@ -61,12 +62,12 @@ module Crystal::System::Time end {% if flag?(:darwin) %} - @@mach_timebase_info : LibC::MachTimebaseInfo? + @@mach_ticks_per_nanosecond : Float64? - private def self.mach_timebase_info - @@mach_timebase_info ||= begin + private def self.mach_ticks_per_nanosecond + @@mach_ticks_per_nanosecond ||= begin LibC.mach_timebase_info(out info) - info + info.numer.to_f64 / info.denom end end {% end %}