From 942c1c12d89a53071ccd883e16d84af2001f2557 Mon Sep 17 00:00:00 2001 From: Hiro Date: Wed, 21 Jun 2023 23:33:51 +0000 Subject: runtime: fix trace.Stop deadlock when built with faketime For #60806 Change-Id: I1ac18a6c7c703a1d6c4cd80f220059ba0be51e09 GitHub-Last-Rev: d300ca3f316d34f5013be43d01a9a473fe3000b2 GitHub-Pull-Request: golang/go#60834 Reviewed-on: https://go-review.googlesource.com/c/go/+/503356 Run-TryBot: Michael Knyszek Reviewed-by: Michael Knyszek Auto-Submit: Michael Knyszek Reviewed-by: Dmitri Shuralyov TryBot-Result: Gopher Robot --- src/runtime/trace.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/runtime/trace.go b/src/runtime/trace.go index ac80ca2902..a4d50d77a0 100644 --- a/src/runtime/trace.go +++ b/src/runtime/trace.go @@ -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() -- cgit v1.2.3-54-g00ecf