]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.11] cmd/trace: don't drop sweep slice details
authorHana Kim <hyangah@gmail.com>
Mon, 17 Sep 2018 18:46:50 +0000 (14:46 -0400)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 1 Nov 2018 18:40:49 +0000 (18:40 +0000)
For sweep events, we used to modify the ViewerEvent returned from
ctx.emitSlice later in order to embed more details about the sweep
operation. The trick no longer works after the change
https://golang.org/cl/92375 and caused a regression.

ctx.emit method encodes the ViewerEvent, so any modification to the
ViewerEvent object after ctx.emit returns will not be reflected.

Refactor ctx.emitSlice, so ctx.makeSlice can be used when producing
slices for SWEEP. ctx.emit* methods are meant to truely emit
ViewerEvents.

Fixes #27717
Updates #27711

Change-Id: I0b733ebbbfd4facd8714db0535809ec3cab0833d
Reviewed-on: https://go-review.googlesource.com/135775
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
(cherry picked from commit e57f24ab39ff6e0ea50c84518e7f91b3a40cf547)
Reviewed-on: https://go-review.googlesource.com/c/146698
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
src/cmd/trace/trace.go

index 62ff4d68c51c5a795f3ebb458b64f397f2497813..307d4e5f6b7a3065be0da19fc9cf5fcaafe636ad 100644 (file)
@@ -685,13 +685,14 @@ func generateTrace(params *traceParams, consumer traceConsumer) error {
                        }
                        ctx.emitSlice(&fakeMarkStart, text)
                case trace.EvGCSweepStart:
-                       slice := ctx.emitSlice(ev, "SWEEP")
+                       slice := ctx.makeSlice(ev, "SWEEP")
                        if done := ev.Link; done != nil && done.Args[0] != 0 {
                                slice.Arg = struct {
                                        Swept     uint64 `json:"Swept bytes"`
                                        Reclaimed uint64 `json:"Reclaimed bytes"`
                                }{done.Args[0], done.Args[1]}
                        }
+                       ctx.emit(slice)
                case trace.EvGoStart, trace.EvGoStartLabel:
                        info := getGInfo(ev.G)
                        if ev.Type == trace.EvGoStartLabel {
@@ -846,7 +847,11 @@ func (ctx *traceContext) proc(ev *trace.Event) uint64 {
        }
 }
 
-func (ctx *traceContext) emitSlice(ev *trace.Event, name string) *ViewerEvent {
+func (ctx *traceContext) emitSlice(ev *trace.Event, name string) {
+       ctx.emit(ctx.makeSlice(ev, name))
+}
+
+func (ctx *traceContext) makeSlice(ev *trace.Event, name string) *ViewerEvent {
        // If ViewerEvent.Dur is not a positive value,
        // trace viewer handles it as a non-terminating time interval.
        // Avoid it by setting the field with a small value.
@@ -885,7 +890,6 @@ func (ctx *traceContext) emitSlice(ev *trace.Event, name string) *ViewerEvent {
                        sl.Cname = colorLightGrey
                }
        }
-       ctx.emit(sl)
        return sl
 }