From a039011f5bf12140170f08ea2216c2a33b680a05 Mon Sep 17 00:00:00 2001 From: cheatfate Date: Tue, 3 Sep 2019 17:30:28 +0300 Subject: [PATCH] Fix clock_gettime() is not available on old MacOS. --- chronos.nimble | 2 +- chronos/timer.nim | 32 +++++++++++++++++++++++--------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/chronos.nimble b/chronos.nimble index 5a9f6083..b3979960 100644 --- a/chronos.nimble +++ b/chronos.nimble @@ -1,5 +1,5 @@ packageName = "chronos" -version = "2.2.9" +version = "2.3.0" author = "Status Research & Development GmbH" description = "Chronos" license = "Apache License 2.0 or MIT" diff --git a/chronos/timer.nim b/chronos/timer.nim index 850e4353..bc8a25fe 100644 --- a/chronos/timer.nim +++ b/chronos/timer.nim @@ -101,22 +101,36 @@ elif defined(macosx): result = (cast[uint64](t.tv_sec) * 1_000_000_000 + cast[uint64](t.tv_usec) * 1_000) else: - from posix import clock_gettime, Timespec, CLOCK_MONOTONIC + type + MachTimebaseInfo {.importc: "struct mach_timebase_info", + header: "", pure, final.} = object + numer: uint32 + denom: uint32 + + proc mach_timebase_info(info: var MachTimebaseInfo) {.importc, + header: "".} + proc mach_absolute_time(): uint64 {.importc, header: "".} + + var queryFrequencyN: uint64 + var queryFrequencyD: uint64 + + proc setupQueryFrequence() = + var info: MachTimebaseInfo + mach_timebase_info(info) + queryFrequencyN = info.numer + queryFrequencyD = info.denom proc fastEpochTime*(): uint64 {. inline, deprecated: "Use Moment.now()".} = ## Procedure's resolution is millisecond. - var t: Timespec - discard clock_gettime(CLOCK_MONOTONIC, t) - result = ((cast[uint64](t.tv_sec) * 1_000) + - (cast[uint64](t.tv_nsec) div 1_000_000)) + result = (mach_absolute_time() * queryFrequencyN) div queryFrequencyD + result = result div 1_000_000 proc fastEpochTimeNano(): uint64 {.inline.} = ## Procedure's resolution is nanosecond. - var t: Timespec - discard clock_gettime(CLOCK_MONOTONIC, t) - result = cast[uint64](t.tv_sec) * 1_000_000_000'u64 + - cast[uint64](t.tv_nsec) + result = (mach_absolute_time() * queryFrequencyN) div queryFrequencyD + + setupQueryFrequence() elif defined(posix): from posix import clock_gettime, Timespec, CLOCK_REALTIME, CLOCK_MONOTONIC