mirror of https://github.com/golang/go.git
runtime: fix trace.Stop deadlock when built with faketime
For #60806
Change-Id: I1ac18a6c7c703a1d6c4cd80f220059ba0be51e09
GitHub-Last-Rev: d300ca3f31
GitHub-Pull-Request: golang/go#60834
Reviewed-on: https://go-review.googlesource.com/c/go/+/503356
Run-TryBot: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
4ad4128d3c
commit
942c1c12d8
|
|
@ -453,12 +453,17 @@ func StopTrace() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Wait for startNanotime != endNanotime. On Windows the default interval between
|
||||||
|
// system clock ticks is typically between 1 and 15 milliseconds, which may not
|
||||||
|
// have passed since the trace started. Without nanotime moving forward, trace
|
||||||
|
// tooling has no way of identifying how much real time each cputicks time deltas
|
||||||
|
// represent.
|
||||||
for {
|
for {
|
||||||
trace.endTime = traceClockNow()
|
trace.endTime = traceClockNow()
|
||||||
trace.endTicks = cputicks()
|
trace.endTicks = cputicks()
|
||||||
trace.endNanotime = nanotime()
|
trace.endNanotime = nanotime()
|
||||||
// Windows time can tick only every 15ms, wait for at least one tick.
|
|
||||||
if trace.endNanotime != trace.startNanotime {
|
if trace.endNanotime != trace.startNanotime || faketime != 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
osyield()
|
osyield()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue