]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.9] runtime: avoid monotonic time zero on systems with low-res...
authorRuss Cox <rsc@golang.org>
Wed, 25 Oct 2017 15:13:23 +0000 (11:13 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 25 Oct 2017 20:23:44 +0000 (20:23 +0000)
Otherwise low-res timers cause problems at call sites that expect to
be able to use 0 as meaning "no time set" and therefore expect that
nanotime never returns 0 itself. For example, sched.lastpoll == 0
means no last poll.

Fixes #22394.

Change-Id: Iea28acfddfff6f46bc90f041ec173e0fea591285
Reviewed-on: https://go-review.googlesource.com/73410
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-on: https://go-review.googlesource.com/73491
TryBot-Result: Russ Cox <rsc@golang.org>

src/runtime/proc.go
src/runtime/time.go

index a631a016a369b36b1bd067c2f68bb196a40fe1ea..5787991f0783ac308b03bf961da6bb8d50c82020 100644 (file)
@@ -142,6 +142,9 @@ func main() {
        }
 
        runtime_init() // must be before defer
+       if nanotime() == 0 {
+               throw("nanotime returning zero")
+       }
 
        // Defer unlock so that runtime.Goexit during init does the unlock too.
        needUnlock := true
index abf200d7d3f7c825f6b5ba21f7c26f9718850baf..23f61d62d0890bd9c583e83840fe8add7938c51d 100644 (file)
@@ -309,4 +309,10 @@ func time_runtimeNano() int64 {
        return nanotime()
 }
 
-var startNano int64 = nanotime()
+// Monotonic times are reported as offsets from startNano.
+// We initialize startNano to nanotime() - 1 so that on systems where
+// monotonic time resolution is fairly low (e.g. Windows 2008
+// which appears to have a default resolution of 15ms),
+// we avoid ever reporting a nanotime of 0.
+// (Callers may want to use 0 as "time not set".)
+var startNano int64 = nanotime() - 1