aboutsummaryrefslogtreecommitdiff
path: root/src/internal
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2015-04-09 10:03:26 -0400
committerAustin Clements <austin@google.com>2015-04-10 18:21:41 +0000
commiteec6fdc90b64a4a2c579ef35b2ce6eaab1f62733 (patch)
treea035894326913256627ac5ff2731e346b73ec019 /src/internal
parent7c37249639a1454c7e8958c4760cc906d18cba2e (diff)
downloadgo-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.go12
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)