lttng: Javadoc udpate for the lttng2.kernel.ui package
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng2.kernel.ui / src / org / eclipse / linuxtools / internal / lttng2 / kernel / ui / views / controlflow / ControlFlowView.java
index b7cd303fea6ce0151ab92887b8d3641fd96ac991..8a27bda95cb1e9865914e9540b2198c22f4e1368 100644 (file)
@@ -1,11 +1,11 @@
 /*******************************************************************************\r
  * Copyright (c) 2012 Ericsson\r
- * \r
+ *\r
  * All rights reserved. This program and the accompanying materials are\r
  * made available under the terms of the Eclipse Public License v1.0 which\r
  * accompanies this distribution, and is available at\r
  * http://www.eclipse.org/legal/epl-v10.html\r
- * \r
+ *\r
  * Contributors:\r
  *   Patrick Tasse - Initial API and implementation\r
  *******************************************************************************/\r
@@ -14,6 +14,8 @@ package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.controlflow;
 \r
 import java.util.ArrayList;\r
 import java.util.Arrays;\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
 import java.util.List;\r
 \r
 import org.eclipse.core.runtime.IProgressMonitor;\r
@@ -39,6 +41,7 @@ import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval;
 import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal;\r
 import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal;\r
 import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;\r
+import org.eclipse.linuxtools.tmf.core.signal.TmfStateSystemBuildCompleted;\r
 import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal;\r
 import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier;\r
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;\r
@@ -64,6 +67,10 @@ import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.TreeColumn;\r
 import org.eclipse.ui.IActionBars;\r
 \r
+/**\r
+ * The Control Flow view main object\r
+ *\r
+ */\r
 public class ControlFlowView extends TmfView {\r
 \r
     // ------------------------------------------------------------------------\r
@@ -82,14 +89,14 @@ public class ControlFlowView extends TmfView {
 \r
     private static final String PROCESS_COLUMN    = Messages.ControlFlowView_processColumn;\r
     private static final String TID_COLUMN        = Messages.ControlFlowView_tidColumn;\r
-    private static final String PPID_COLUMN       = Messages.ControlFlowView_ppidColumn;\r
+    private static final String PTID_COLUMN       = Messages.ControlFlowView_ptidColumn;\r
     private static final String BIRTH_TIME_COLUMN = Messages.ControlFlowView_birthTimeColumn;\r
     private static final String TRACE_COLUMN      = Messages.ControlFlowView_traceColumn;\r
 \r
     private final String[] COLUMN_NAMES = new String[] {\r
             PROCESS_COLUMN,\r
             TID_COLUMN,\r
-            PPID_COLUMN,\r
+            PTID_COLUMN,\r
             BIRTH_TIME_COLUMN,\r
             TRACE_COLUMN\r
     };\r
@@ -107,6 +114,9 @@ public class ControlFlowView extends TmfView {
     // The timegraph entry list\r
     private ArrayList<ControlFlowEntry> fEntryList;\r
 \r
+    // The time graph entry list synchronization object\r
+    final private Object fEntryListSyncObj = new Object();\r
+\r
     // The start time\r
     private long fStartTime;\r
 \r
@@ -114,7 +124,7 @@ public class ControlFlowView extends TmfView {
     private long fEndTime;\r
 \r
     // The display width\r
-    private int fDisplayWidth;\r
+    private final int fDisplayWidth;\r
 \r
     // The zoom thread\r
     private ZoomThread fZoomThread;\r
@@ -125,6 +135,9 @@ public class ControlFlowView extends TmfView {
     // The previous resource action\r
     private Action fPreviousResourceAction;\r
 \r
+    // A comparator class\r
+    private final ControlFlowEntryComparator fControlFlowEntryComparator = new ControlFlowEntryComparator();\r
+\r
     // ------------------------------------------------------------------------\r
     // Classes\r
     // ------------------------------------------------------------------------\r
@@ -196,8 +209,8 @@ public class ControlFlowView extends TmfView {
             } else if (columnIndex == 1) {\r
                 return Integer.toString(entry.getThreadId());\r
             } else if (columnIndex == 2) {\r
-                if (entry.getPPID() > 0) {\r
-                    return Integer.toString(entry.getPPID());\r
+                if (entry.getParentThreadId() > 0) {\r
+                    return Integer.toString(entry.getParentThreadId());\r
                 }\r
             } else if (columnIndex == 3) {\r
                 return Utils.formatTime(entry.getBirthTime(), TimeFormat.ABSOLUTE, Resolution.NANOSEC);\r
@@ -209,11 +222,38 @@ public class ControlFlowView extends TmfView {
 \r
     }\r
 \r
+    private static class ControlFlowEntryComparator implements Comparator<ITimeGraphEntry> {\r
+\r
+        @Override\r
+        public int compare(ITimeGraphEntry o1, ITimeGraphEntry o2) {\r
+            int result = 0;\r
+\r
+            if ((o1 instanceof ControlFlowEntry) && (o2 instanceof ControlFlowEntry)) {\r
+                ControlFlowEntry entry1 = (ControlFlowEntry) o1;\r
+                ControlFlowEntry entry2 = (ControlFlowEntry) o2;\r
+                result = entry1.getTrace().getStartTime().compareTo(entry2.getTrace().getStartTime());\r
+                if (result == 0) {\r
+                    result = entry1.getTrace().getName().compareTo(entry2.getTrace().getName());\r
+                }\r
+                if (result == 0) {\r
+                    result = entry1.getThreadId() < entry2.getThreadId() ? -1 : entry1.getThreadId() > entry2.getThreadId() ? 1 : 0;\r
+                }\r
+            }\r
+\r
+            if (result == 0) {\r
+                result = o1.getStartTime() < o2.getStartTime() ? -1 : o1.getStartTime() > o2.getStartTime() ? 1 : 0;\r
+            }\r
+\r
+            return result;\r
+        }\r
+    }\r
+\r
+\r
     private class ZoomThread extends Thread {\r
-        private long fZoomStartTime;\r
-        private long fZoomEndTime;\r
-        private long fResolution;\r
-        private IProgressMonitor fMonitor;\r
+        private final long fZoomStartTime;\r
+        private final long fZoomEndTime;\r
+        private final long fResolution;\r
+        private final IProgressMonitor fMonitor;\r
 \r
         public ZoomThread(long startTime, long endTime) {\r
             super("ControlFlowView zoom"); //$NON-NLS-1$\r
@@ -225,13 +265,16 @@ public class ControlFlowView extends TmfView {
 \r
         @Override\r
         public void run() {\r
-            ArrayList<ControlFlowEntry> entryList = fEntryList;\r
+            ArrayList<ControlFlowEntry> entryList = null;\r
+            synchronized (fEntryListSyncObj) {\r
+                entryList = fEntryList;\r
+            }\r
             if (entryList == null) {\r
                 return;\r
             }\r
             for (ControlFlowEntry entry : entryList) {\r
                 if (fMonitor.isCanceled()) {\r
-                    return;\r
+                    break;\r
                 }\r
                 zoom(entry, fMonitor);\r
             }\r
@@ -239,11 +282,14 @@ public class ControlFlowView extends TmfView {
         }\r
 \r
         private void zoom(ControlFlowEntry entry, IProgressMonitor monitor) {\r
-            List<ITimeEvent> zoomedEventList = getEventList(entry, fZoomStartTime, fZoomEndTime, fResolution, monitor);\r
-            if (fMonitor.isCanceled()) {\r
-                return;\r
+            if (fZoomStartTime <= fStartTime && fZoomEndTime >= fEndTime) {\r
+                entry.setZoomedEventList(null);\r
+            } else {\r
+                List<ITimeEvent> zoomedEventList = getEventList(entry, fZoomStartTime, fZoomEndTime, fResolution, monitor);\r
+                if (zoomedEventList != null) {\r
+                    entry.setZoomedEventList(zoomedEventList);\r
+                }\r
             }\r
-            entry.setZoomedEventList(zoomedEventList);\r
             for (ControlFlowEntry child : entry.getChildren()) {\r
                 if (fMonitor.isCanceled()) {\r
                     return;\r
@@ -261,6 +307,9 @@ public class ControlFlowView extends TmfView {
     // Constructors\r
     // ------------------------------------------------------------------------\r
 \r
+    /**\r
+     * Constructor\r
+     */\r
     public ControlFlowView() {\r
         super(ID);\r
         fDisplayWidth = Display.getDefault().getBounds().width;\r
@@ -344,6 +393,12 @@ public class ControlFlowView extends TmfView {
     // Signal handlers\r
     // ------------------------------------------------------------------------\r
 \r
+    /**\r
+     * Handler for the experiment selected signal\r
+     *\r
+     * @param signal\r
+     *            The signal that's received\r
+     */\r
     @TmfSignalHandler\r
     public void experimentSelected(final TmfExperimentSelectedSignal<? extends ITmfEvent> signal) {\r
         if (signal.getExperiment().equals(fSelectedExperiment)) {\r
@@ -359,9 +414,15 @@ public class ControlFlowView extends TmfView {
         thread.start();\r
     }\r
 \r
+    /**\r
+     * Handler for the synch signal\r
+     *\r
+     * @param signal\r
+     *            The signal that's received\r
+     */\r
     @TmfSignalHandler\r
     public void synchToTime(final TmfTimeSynchSignal signal) {\r
-        if (signal.getSource() == this) {\r
+        if (signal.getSource() == this || fSelectedExperiment == null) {\r
             return;\r
         }\r
         final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
@@ -400,7 +461,7 @@ public class ControlFlowView extends TmfView {
             }\r
         }\r
         final int selectedThread = thread;\r
\r
+\r
         Display.getDefault().asyncExec(new Runnable() {\r
             @Override\r
             public void run() {\r
@@ -416,6 +477,7 @@ public class ControlFlowView extends TmfView {
                             ControlFlowEntry entry = (ControlFlowEntry) element;\r
                             if (entry.getThreadId() == selectedThread) {\r
                                 fTimeGraphCombo.setSelection(entry);\r
+                                break;\r
                             }\r
                         }\r
                     }\r
@@ -424,9 +486,15 @@ public class ControlFlowView extends TmfView {
         });\r
     }\r
 \r
+    /**\r
+     * Handler for the range sync signal\r
+     *\r
+     * @param signal\r
+     *            The signal that's received\r
+     */\r
     @TmfSignalHandler\r
     public void synchToRange(final TmfRangeSynchSignal signal) {\r
-        if (signal.getSource() == this) {\r
+        if (signal.getSource() == this || fSelectedExperiment == null) {\r
             return;\r
         }\r
         final long startTime = signal.getCurrentRange().getStartTime().normalize(0, -9).getValue();\r
@@ -445,6 +513,32 @@ public class ControlFlowView extends TmfView {
         });\r
     }\r
 \r
+    /**\r
+     * Handler for the state system build completed signal\r
+     *\r
+     * @param signal\r
+     *            The signal that's received\r
+     */\r
+    @TmfSignalHandler\r
+    public void stateSystemBuildCompleted (final TmfStateSystemBuildCompleted signal) {\r
+        final TmfExperiment<?> selectedExperiment = fSelectedExperiment;\r
+        if (selectedExperiment == null) {\r
+            return;\r
+        }\r
+        for (ITmfTrace<?> trace : selectedExperiment.getTraces()) {\r
+            if (trace == signal.getTrace() && trace instanceof CtfKernelTrace) {\r
+                final Thread thread = new Thread("ControlFlowView build") { //$NON-NLS-1$\r
+                    @Override\r
+                    public void run() {\r
+                        // rebuild the model\r
+                        selectExperiment(selectedExperiment);\r
+                    }\r
+                };\r
+                thread.start();\r
+            }\r
+        }\r
+    }\r
+\r
     // ------------------------------------------------------------------------\r
     // Internal\r
     // ------------------------------------------------------------------------\r
@@ -454,13 +548,14 @@ public class ControlFlowView extends TmfView {
         fStartTime = Long.MAX_VALUE;\r
         fEndTime = Long.MIN_VALUE;\r
         fSelectedExperiment = (TmfExperiment<ITmfEvent>) experiment;\r
-        ArrayList<ControlFlowEntry> entryList = new ArrayList<ControlFlowEntry>();\r
+        ArrayList<ControlFlowEntry> rootList = new ArrayList<ControlFlowEntry>();\r
         for (ITmfTrace<?> trace : experiment.getTraces()) {\r
             if (trace instanceof CtfKernelTrace) {\r
+                ArrayList<ControlFlowEntry> entryList = new ArrayList<ControlFlowEntry>();\r
                 CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace;\r
                 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
                 long start = ssq.getStartTime();\r
-                long end = ssq.getCurrentEndTime();\r
+                long end = ssq.getCurrentEndTime() + 1;\r
                 fStartTime = Math.min(fStartTime, start);\r
                 fEndTime = Math.max(fEndTime, end);\r
                 List<Integer> threadQuarks = ssq.getQuarks(Attributes.THREADS, "*"); //$NON-NLS-1$\r
@@ -483,7 +578,7 @@ public class ControlFlowView extends TmfView {
                             continue;\r
                         }\r
                         int ppidQuark = ssq.getQuarkRelative(threadQuark, Attributes.PPID);\r
-                        List<ITmfStateInterval> execNameIntervals = ssq.queryHistoryRange(execNameQuark, start, end);\r
+                        List<ITmfStateInterval> execNameIntervals = ssq.queryHistoryRange(execNameQuark, start, end - 1);\r
                         long birthTime = -1;\r
                         for (ITmfStateInterval execNameInterval : execNameIntervals) {\r
                             if (!execNameInterval.getStateValue().isNull() && execNameInterval.getStateValue().getType() == 1) {\r
@@ -513,24 +608,25 @@ public class ControlFlowView extends TmfView {
                         e.printStackTrace();\r
                     }\r
                 }\r
+                buildTree(entryList, rootList);\r
             }\r
-            buildTree(entryList);\r
-            refresh(INITIAL_WINDOW_OFFSET);\r
-            ControlFlowEntry[] entries = fEntryList.toArray(new ControlFlowEntry[0]);\r
-            Arrays.sort(entries);\r
-            for (ControlFlowEntry entry : entries) {\r
-                buildStatusEvents(entry);\r
+            Collections.sort(rootList, fControlFlowEntryComparator);\r
+            synchronized (fEntryListSyncObj) {\r
+                fEntryList = (ArrayList<ControlFlowEntry>) rootList.clone();\r
             }\r
+            refresh(INITIAL_WINDOW_OFFSET);\r
+        }\r
+        for (ControlFlowEntry entry : rootList) {\r
+            buildStatusEvents(entry);\r
         }\r
     }\r
 \r
-    private void buildTree(ArrayList<ControlFlowEntry> entryList) {\r
-        ArrayList<ControlFlowEntry> rootList = new ArrayList<ControlFlowEntry>();\r
+    private void buildTree(ArrayList<ControlFlowEntry> entryList, ArrayList<ControlFlowEntry> rootList) {\r
         for (ControlFlowEntry entry : entryList) {\r
             boolean root = true;\r
-            if (entry.getPPID() > 0) {\r
+            if (entry.getParentThreadId() > 0) {\r
                 for (ControlFlowEntry parent : entryList) {\r
-                    if (parent.getThreadId() == entry.getPPID() &&\r
+                    if (parent.getThreadId() == entry.getParentThreadId() &&\r
                             entry.getStartTime() >= parent.getStartTime() &&\r
                             entry.getStartTime() <= parent.getEndTime()) {\r
                         parent.addChild(entry);\r
@@ -543,13 +639,12 @@ public class ControlFlowView extends TmfView {
                 rootList.add(entry);\r
             }\r
         }\r
-        fEntryList = rootList;\r
     }\r
 \r
     private void buildStatusEvents(ControlFlowEntry entry) {\r
         IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
         long start = ssq.getStartTime();\r
-        long end = ssq.getCurrentEndTime();\r
+        long end = ssq.getCurrentEndTime() + 1;\r
         long resolution = Math.max(1, (end - start) / fDisplayWidth);\r
         List<ITimeEvent> eventList = getEventList(entry, entry.getStartTime(), entry.getEndTime(), resolution, new NullProgressMonitor());\r
         entry.setEventList(eventList);\r
@@ -605,8 +700,11 @@ public class ControlFlowView extends TmfView {
                 if (fTimeGraphCombo.isDisposed()) {\r
                     return;\r
                 }\r
-                ITimeGraphEntry[] entries = fEntryList.toArray(new ITimeGraphEntry[0]);\r
-                Arrays.sort(entries);\r
+                ITimeGraphEntry[] entries = null;\r
+                synchronized (fEntryListSyncObj) {\r
+                    entries = fEntryList.toArray(new ITimeGraphEntry[0]);\r
+                }\r
+                Arrays.sort(entries, fControlFlowEntryComparator);\r
                 fTimeGraphCombo.setInput(entries);\r
                 fTimeGraphCombo.getTimeGraphViewer().setTimeBounds(fStartTime, fEndTime);\r
 \r
This page took 0.029174 seconds and 5 git commands to generate.