From eec6fdc90b64a4a2c579ef35b2ce6eaab1f62733 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Thu, 9 Apr 2015 10:03:26 -0400 Subject: [PATCH] internal/trace: don't assume GC will start and end on same P Currently, GC disables preemption between the traceGCStart and traceGCDone, so it never moves Ps. Consequently, the trace verifier attaches information about GC to its per-P state and will fail if GC starts on one P and ends on another. GC will soon be preemptible and may end on a different P than it began. Hence, this change lifts this per-P verifier state to global state. Change-Id: I82256e2baab1ff3c4453fec312079018423b4b51 Reviewed-on: https://go-review.googlesource.com/8714 Reviewed-by: Dmitry Vyukov Reviewed-by: Rick Hudson --- src/internal/trace/parser.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/internal/trace/parser.go b/src/internal/trace/parser.go index 1b4538f11b..8d48bfdfe6 100644 --- a/src/internal/trace/parser.go +++ b/src/internal/trace/parser.go @@ -350,7 +350,6 @@ func postProcessTrace(events []*Event) error { type pdesc struct { running bool g uint64 - evGC *Event evScan *Event evSweep *Event } @@ -358,6 +357,7 @@ func postProcessTrace(events []*Event) error { gs := make(map[uint64]gdesc) ps := make(map[int]pdesc) gs[0] = gdesc{state: gRunning} + var evGC *Event checkRunning := func(p pdesc, g gdesc, ev *Event) error { name := EventDescriptions[ev.Type].Name @@ -389,16 +389,16 @@ func postProcessTrace(events []*Event) error { } p.running = false case EvGCStart: - if p.evGC != nil { + if evGC != nil { return fmt.Errorf("previous GC is not ended before a new one (offset %v, time %v)", ev.Off, ev.Ts) } - p.evGC = ev + evGC = ev case EvGCDone: - if p.evGC == nil { + if evGC == nil { return fmt.Errorf("bogus GC end (offset %v, time %v)", ev.Off, ev.Ts) } - p.evGC.Link = ev - p.evGC = nil + evGC.Link = ev + evGC = nil case EvGCScanStart: if p.evScan != nil { return fmt.Errorf("previous scanning is not ended before a new one (offset %v, time %v)", ev.Off, ev.Ts)