From 5b6c85f4febe7d10ea704cb82c43901b16effac4 Mon Sep 17 00:00:00 2001 From: flywind Date: Fri, 30 Apr 2021 14:34:51 +0800 Subject: [PATCH 1/6] fix #17898 --- lib/pure/times.nim | 9 +++++++-- tests/stdlib/trandom.nim | 12 ++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/pure/times.nim b/lib/pure/times.nim index a92eccc8c1c8..79071e2bf971 100644 --- a/lib/pure/times.nim +++ b/lib/pure/times.nim @@ -880,6 +880,11 @@ since((1, 1)): export fromUnixFloat export toUnixFloat + +when defined(windows): # TODO to replace + proc getSystemTimePreciseAsFileTime(lpSystemTimeAsFileTime: var FILETIME) {. + importc: "GetSystemTimePreciseAsFileTime", dynlib: "kernel32", stdcall, sideEffect.} + proc fromWinTime*(win: int64): Time = ## Convert a Windows file time (100-nanosecond intervals since ## `1601-01-01T00:00:00Z`) to a `Time`. @@ -912,7 +917,7 @@ proc getTime*(): Time {.tags: [TimeEffect], benign.} = result = initTime(ts.tv_sec.int64, ts.tv_nsec.int) elif defined(windows): var f {.noinit.}: FILETIME - getSystemTimeAsFileTime(f) + getSystemTimePreciseAsFileTime(f) result = fromWinTime(rdFileTime(f)) proc `-`*(a, b: Time): Duration {.operator, extern: "ntDiffTime".} = @@ -2595,7 +2600,7 @@ proc epochTime*(): float {.tags: [TimeEffect].} = toBiggestFloat(ts.tv_nsec.int64) / 1_000_000_000 elif defined(windows): var f {.noinit.}: winlean.FILETIME - getSystemTimeAsFileTime(f) + getSystemTimePreciseAsFileTime(f) var i64 = rdFileTime(f) - epochDiff var secs = i64 div rateDiff var subsecs = i64 mod rateDiff diff --git a/tests/stdlib/trandom.nim b/tests/stdlib/trandom.nim index 9fc68fca11aa..e8f9ed462a8a 100644 --- a/tests/stdlib/trandom.nim +++ b/tests/stdlib/trandom.nim @@ -164,3 +164,15 @@ block: # random sample let stdDev = sqrt(n * p * (1.0 - p)) # NOTE: like unnormalized int CDF test, P(wholeTestFails) =~ 0.01. doAssert abs(float(histo[values[i]]) - expected) <= 3.0 * stdDev + + +when not defined(js): + block: # bug #17898 + var unique: HashSet[Rand] + + let size = 10 + + for i in 0 ..< size: + unique.incl initRand() + + doAssert unique.len == size From ea42ade39e144606bf869b0bb95f2ace6cefeb1f Mon Sep 17 00:00:00 2001 From: flywind Date: Wed, 2 Jun 2021 00:48:57 +0800 Subject: [PATCH 2/6] typo --- lib/pure/times.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/times.nim b/lib/pure/times.nim index 925c49070ec9..81008b5a9641 100644 --- a/lib/pure/times.nim +++ b/lib/pure/times.nim @@ -881,7 +881,7 @@ since((1, 1)): export toUnixFloat -when defined(windows): # TODO put to a seperate module +when defined(windows): # TODO put to a separate module proc getSystemTimePreciseAsFileTime(lpSystemTimeAsFileTime: var FILETIME) {. importc: "GetSystemTimePreciseAsFileTime", dynlib: "kernel32", stdcall, sideEffect.} From e67ec46ae860a7fa9b6f50383c2ecc269b0b4b0b Mon Sep 17 00:00:00 2001 From: flywind Date: Wed, 2 Jun 2021 12:04:33 +0800 Subject: [PATCH 3/6] Update lib/pure/times.nim --- lib/pure/times.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/times.nim b/lib/pure/times.nim index 81008b5a9641..f221582f84a3 100644 --- a/lib/pure/times.nim +++ b/lib/pure/times.nim @@ -881,7 +881,7 @@ since((1, 1)): export toUnixFloat -when defined(windows): # TODO put to a separate module +when defined(windows): # TODO move to winlean proc getSystemTimePreciseAsFileTime(lpSystemTimeAsFileTime: var FILETIME) {. importc: "GetSystemTimePreciseAsFileTime", dynlib: "kernel32", stdcall, sideEffect.} From 62c2e5f087a77c0f047a1c7d3f0b205535ce0b64 Mon Sep 17 00:00:00 2001 From: flywind Date: Wed, 2 Jun 2021 12:23:24 +0800 Subject: [PATCH 4/6] rewrite the test --- tests/stdlib/trandom.nim | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/tests/stdlib/trandom.nim b/tests/stdlib/trandom.nim index a1294259289c..92c7685d8473 100644 --- a/tests/stdlib/trandom.nim +++ b/tests/stdlib/trandom.nim @@ -191,11 +191,17 @@ block: # bug #17467 when not defined(js) and not defined(macosx): ## TODO improve `getTime` precision on MacOS block: # bug #17898 - var unique: HashSet[Rand] - - let size = 10 - - for i in 0 ..< size: - unique.incl initRand() - - doAssert unique.len == size + let size = 1000 + var vals = newSeq[Rand](size) + for i in 0.. Date: Wed, 2 Jun 2021 14:04:57 +0800 Subject: [PATCH 5/6] Update trandom.nim --- tests/stdlib/trandom.nim | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/tests/stdlib/trandom.nim b/tests/stdlib/trandom.nim index 92c7685d8473..e47ddad66603 100644 --- a/tests/stdlib/trandom.nim +++ b/tests/stdlib/trandom.nim @@ -187,21 +187,3 @@ block: # bug #17467 doAssert x > 1e-4, $(x, i) # This used to fail for each i in 0..<26844, i.e. the 1st produced value # was predictable and < 1e-4, skewing distributions. - -when not defined(js) and not defined(macosx): - ## TODO improve `getTime` precision on MacOS - block: # bug #17898 - let size = 1000 - var vals = newSeq[Rand](size) - for i in 0.. Date: Wed, 23 Jun 2021 22:59:59 +0800 Subject: [PATCH 6/6] fix --- lib/pure/times.nim | 4 ---- lib/windows/winlean.nim | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/pure/times.nim b/lib/pure/times.nim index f221582f84a3..7bb393aa0ac7 100644 --- a/lib/pure/times.nim +++ b/lib/pure/times.nim @@ -881,10 +881,6 @@ since((1, 1)): export toUnixFloat -when defined(windows): # TODO move to winlean - proc getSystemTimePreciseAsFileTime(lpSystemTimeAsFileTime: var FILETIME) {. - importc: "GetSystemTimePreciseAsFileTime", dynlib: "kernel32", stdcall, sideEffect.} - proc fromWinTime*(win: int64): Time = ## Convert a Windows file time (100-nanosecond intervals since ## `1601-01-01T00:00:00Z`) to a `Time`. diff --git a/lib/windows/winlean.nim b/lib/windows/winlean.nim index d2d7d26ccfe0..a71dd97d8fd8 100644 --- a/lib/windows/winlean.nim +++ b/lib/windows/winlean.nim @@ -928,6 +928,9 @@ proc getProcessTimes*(hProcess: Handle; lpCreationTime, lpExitTime, lpKernelTime, lpUserTime: var FILETIME): WINBOOL {.stdcall, dynlib: "kernel32", importc: "GetProcessTimes".} +proc getSystemTimePreciseAsFileTime*(lpSystemTimeAsFileTime: var FILETIME) {. + importc: "GetSystemTimePreciseAsFileTime", dynlib: "kernel32", stdcall, sideEffect.} + type inet_ntop_proc = proc(family: cint, paddr: pointer, pStringBuffer: cstring, stringBufSize: int32): cstring {.gcsafe, stdcall, tags: [].}