diff options
| author | Austin Clements <austin@google.com> | 2015-04-09 10:03:26 -0400 |
|---|---|---|
| committer | Austin Clements <austin@google.com> | 2015-04-10 18:21:41 +0000 |
| commit | eec6fdc90b64a4a2c579ef35b2ce6eaab1f62733 (patch) | |
| tree | a035894326913256627ac5ff2731e346b73ec019 /src/internal | |
| parent | 7c37249639a1454c7e8958c4760cc906d18cba2e (diff) | |
| download | go-eec6fdc90b64a4a2c579ef35b2ce6eaab1f62733.tar.xz | |
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 <dvyukov@google.com>
Reviewed-by: Rick Hudson <rlh@golang.org>
Diffstat (limited to 'src/internal')
| -rw-r--r-- | src/internal/trace/parser.go | 12 |
1 files 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) |
