From 64e48bbaba5a35049befe695ce0ff54ce93e2955 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Wed, 1 Jul 2015 16:41:27 +0200 Subject: [PATCH] internal/trace: stable sort events On some VMs two events can happen at the same time. For examples: 179827399 GoStart p=2 g=11 off=936359 g=11 179827399 GoUnblock p=2 g=0 off=936355 g=11 If we do non-stable sort, the events can be reordered making the trace inconsistent. Do stable sort instead. Batches are dumped in FIFO order, so if these same-time events are split into separate batches, stable sort still works. Events on different CPUs go into different batches and can be reordered. But the intention is that causally-related events on different CPUs will have larger (non-zero) time diff. Update #11320 Change-Id: Id1df96af41dff68ea1782ab4b23d5afd63b890c9 Reviewed-on: https://go-review.googlesource.com/11834 Reviewed-by: Brad Fitzpatrick --- src/internal/trace/parser.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/internal/trace/parser.go b/src/internal/trace/parser.go index 330671325d2d3b..1117b18e4769b7 100644 --- a/src/internal/trace/parser.go +++ b/src/internal/trace/parser.go @@ -254,7 +254,7 @@ func parseEvents(rawEvents []rawEvent) (events []*Event, err error) { } // Sort by time and translate cpu ticks to real time. - sort.Sort(eventList(events)) + sort.Stable(eventList(events)) if ticksPerSec == 0 { err = fmt.Errorf("no EvFrequency event") return