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:
Hiro 2023-06-21 23:33:51 +00:00 committed by Gopher Robot
parent 4ad4128d3c
commit 942c1c12d8
1 changed files with 7 additions and 2 deletions

View File

@ -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 {
trace.endTime = traceClockNow()
trace.endTicks = cputicks()
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
}
osyield()