Skip to content

Commit

Permalink
Fix: don't lose monotonic clock precision on darwin
Browse files Browse the repository at this point in the history
  • Loading branch information
ysbaddaden committed Oct 12, 2017
1 parent b6d4c28 commit 1652420
Showing 1 changed file with 8 additions and 7 deletions.
15 changes: 8 additions & 7 deletions src/crystal/system/unix/time.cr
Original file line number Diff line number Diff line change
Expand Up @@ -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)")
Expand All @@ -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 %}
Expand Down

0 comments on commit 1652420

Please sign in to comment.