timing: Fix duration of flamegraph view
authorGeneviève Bastien <gbastien+lttng@versatic.net>
Mon, 19 Sep 2016 01:25:05 +0000 (21:25 -0400)
committerMatthew Khouzam <matthew.khouzam@ericsson.com>
Fri, 30 Sep 2016 17:46:22 +0000 (13:46 -0400)
Instead of having a duration of the full length of the trace, it has the
duration of the longest element.

Change-Id: Id56b0d23b8a7619672eb3537dd5ca5d4392708db
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
Reviewed-on: https://git.eclipse.org/r/81301
Reviewed-by: Hudson CI
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Tested-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/flamegraph/FlameGraphContentProvider.java

index d7361665adbc069c9e9caa27f1469fe4581e4ea5..02a6c70ca7c38c5413ddec98609438d01f8233fe 100644 (file)
@@ -36,8 +36,7 @@ import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.TimeGraphEntry;
  */
 public class FlameGraphContentProvider implements ITimeGraphContentProvider {
 
-    private List<FlamegraphDepthEntry> fFlameGraphEntries = new ArrayList<>();
-    private long fThreadDuration;
+    private final List<FlamegraphDepthEntry> fFlameGraphEntries = new ArrayList<>();
     private ITmfTrace fActiveTrace;
     private SortOption fSortOption = SortOption.BY_NAME;
     private @NonNull Comparator<FlamegraphDepthEntry> fThreadComparator = new ThreadNameComparator();
@@ -55,16 +54,19 @@ public class FlameGraphContentProvider implements ITimeGraphContentProvider {
      *            A stack used to save the functions timeStamps
      */
     private void setData(AggregatedCalledFunction firstNode, List<FlamegraphDepthEntry> childrenEntries, Deque<Long> timestampStack) {
+        long lastEnd = timestampStack.peek();
         for (int i = 0; i < firstNode.getMaxDepth(); i++) {
             if (i >= childrenEntries.size()) {
-                FlamegraphDepthEntry entry = new FlamegraphDepthEntry(String.valueOf(i), 0, fActiveTrace.getEndTime().toNanos() - fActiveTrace.getStartTime().toNanos(), i, i);
+                FlamegraphDepthEntry entry = new FlamegraphDepthEntry(String.valueOf(i), 0, firstNode.getDuration(), i, i);
                 childrenEntries.add(entry);
             }
+            childrenEntries.get(i).updateEndTime(lastEnd + firstNode.getDuration());
         }
         FlamegraphDepthEntry firstEntry = checkNotNull(childrenEntries.get(0));
-        firstEntry.addEvent(new FlamegraphEvent(firstEntry, timestampStack.peek(), firstNode));
+        firstEntry.addEvent(new FlamegraphEvent(firstEntry, lastEnd, firstNode));
         // Build the event list for next entries (next depth)
         addEvent(firstNode, childrenEntries, timestampStack);
+        timestampStack.pop();
     }
 
     /**
@@ -133,24 +135,24 @@ public class FlameGraphContentProvider implements ITimeGraphContentProvider {
      *            The node of the aggregation tree
      */
     private void buildChildrenEntries(ThreadNode threadNode) {
-        FlamegraphDepthEntry threadEntry = new FlamegraphDepthEntry("", 0, fActiveTrace.getEndTime().toNanos() - fActiveTrace.getStartTime().toNanos(), fFlameGraphEntries.size(), threadNode.getId()); //$NON-NLS-1$
+        FlamegraphDepthEntry threadEntry = new FlamegraphDepthEntry("", 0, 0, fFlameGraphEntries.size(), threadNode.getId()); //$NON-NLS-1$
         List<FlamegraphDepthEntry> childrenEntries = new ArrayList<>();
-        fThreadDuration = 0L;
+        Deque<Long> timestampStack = new ArrayDeque<>();
+        timestampStack.push(0L);
         // Sort children by duration
         threadNode.getChildren().stream()
                 .sorted(Comparator.comparingLong(AggregatedCalledFunction::getDuration))
                 .forEach(rootFunction -> {
-                    Deque<Long> timestampStack = new ArrayDeque<>();
-                    timestampStack.push(fThreadDuration);
                     setData(rootFunction, childrenEntries, timestampStack);
-                    fThreadDuration += rootFunction.getDuration();
-                    timestampStack.pop();
+                    long currentThreadDuration = timestampStack.pop() + rootFunction.getDuration();
+                    timestampStack.push(currentThreadDuration);
                 });
         childrenEntries.forEach(child -> {
             if (child != null) {
                 threadEntry.addChild(child);
             }
         });
+        threadEntry.updateEndTime(timestampStack.pop());
         threadEntry.setName(threadNode.getSymbol().toString());
         fFlameGraphEntries.add(threadEntry);
     }
This page took 0.026542 seconds and 5 git commands to generate.