]> Cypherpunks repositories - gostls13.git/commitdiff
internal/trace: don't assume GC will start and end on same P
authorAustin Clements <austin@google.com>
Thu, 9 Apr 2015 14:03:26 +0000 (10:03 -0400)
committerAustin Clements <austin@google.com>
Fri, 10 Apr 2015 18:21:41 +0000 (18:21 +0000)
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>
src/internal/trace/parser.go

index 1b4538f11b56d5b1d73126f822011f9541d5d568..8d48bfdfe66c16c2d582dbaf3118e02964a02d44 100644 (file)
@@ -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)