Bug 378402: Implementation of ControlFlow view and Resources view for
authorPatrick Tasse <patrick.tasse@gmail.com>
Fri, 18 May 2012 22:04:59 +0000 (18:04 -0400)
committerPatrick Tasse <patrick.tasse@gmail.com>
Fri, 18 May 2012 22:04:59 +0000 (18:04 -0400)
LTTng 2.0.

org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/Messages.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/messages.properties
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/controlflow/ControlFlowEntry.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/controlflow/ControlFlowView.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesEntry.java
org.eclipse.linuxtools.lttng2.kernel.ui/src/org/eclipse/linuxtools/internal/lttng2/kernel/ui/views/resources/ResourcesView.java
org.eclipse.linuxtools.lttng2.ui/src/org/eclipse/linuxtools/internal/lttng2/ui/views/control/ControlView.java

index 485fd953349020881631f79a9f6a1eae5a11624d..2ca135f4d607d525accb93ba2409b9da16dbc2af 100644 (file)
@@ -5,16 +5,25 @@ import org.eclipse.osgi.util.NLS;
 public class Messages extends NLS {\r
     private static final String BUNDLE_NAME = "org.eclipse.linuxtools.internal.lttng2.kernel.ui.messages"; //$NON-NLS-1$\r
 \r
-    public static String ControlFlowView_birthNsecColumn;\r
-    public static String ControlFlowView_birthSecColumn;\r
-    public static String ControlFlowView_brandColumn;\r
-    public static String ControlFlowView_cpuColumn;\r
+    public static String ControlFlowView_birthTimeColumn;\r
     public static String ControlFlowView_tidColumn;\r
     public static String ControlFlowView_ppidColumn;\r
     public static String ControlFlowView_processColumn;\r
-    public static String ControlFlowView_tgidColumn;\r
     public static String ControlFlowView_traceColumn;\r
+    \r
+    public static String ControlFlowView_stateTypeName;\r
+    public static String ControlFlowView_nextProcessActionNameText;\r
+    public static String ControlFlowView_nextProcessActionToolTipText;\r
+    public static String ControlFlowView_previousProcessActionNameText;\r
+    public static String ControlFlowView_previousProcessActionToolTipText;\r
 \r
+    public static String ResourcesView_stateTypeName;\r
+    public static String ResourcesView_nextResourceActionNameText;\r
+    public static String ResourcesView_nextResourceActionToolTipText;\r
+    public static String ResourcesView_previousResourceActionNameText;\r
+    public static String ResourcesView_previousResourceActionToolTipText;\r
+    \r
+    \r
     static {\r
         // initialize resource bundle\r
         NLS.initializeMessages(BUNDLE_NAME, Messages.class);\r
index e843cdd21739eaaba52eb99074e0bad94c9ac8f3..ba3e361d0972a46b09d0ffcf7ce7c2fb9e973fbe 100644 (file)
@@ -1,9 +1,17 @@
-ControlFlowView_birthNsecColumn=Birth nsec\r
-ControlFlowView_birthSecColumn=Birth sec\r
-ControlFlowView_brandColumn=Brand\r
-ControlFlowView_cpuColumn=CPU\r
+ControlFlowView_birthTimeColumn=Birth time\r
 ControlFlowView_tidColumn=TID\r
 ControlFlowView_ppidColumn=PPID\r
 ControlFlowView_processColumn=Process\r
-ControlFlowView_tgidColumn=TGID\r
 ControlFlowView_traceColumn=Trace\r
+\r
+ControlFlowView_stateTypeName=Process States\r
+ControlFlowView_nextProcessActionNameText=Next Process\r
+ControlFlowView_nextProcessActionToolTipText=Select Next Process\r
+ControlFlowView_previousProcessActionNameText=Previous Process\r
+ControlFlowView_previousProcessActionToolTipText=Select Previous Process\r
+\r
+ResourcesView_stateTypeName=Resource States\r
+ResourcesView_nextResourceActionNameText=Next Resource\r
+ResourcesView_nextResourceActionToolTipText=Select Next Resource\r
+ResourcesView_previousResourceActionNameText=Previous Resource\r
+ResourcesView_previousResourceActionToolTipText=Select Previous Resource\r
index 12da4aedf069cb661fa70323a639db8110585130..1597439619ea6aad367dd21b2d6864793ec85ae2 100644 (file)
 \r
 package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.controlflow;\r
 \r
+import java.util.ArrayList;\r
 import java.util.Iterator;\r
-import java.util.LinkedList;\r
 import java.util.List;\r
 \r
+import org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.common.EventIterator;\r
 import org.eclipse.linuxtools.lttng2.kernel.core.trace.CtfKernelTrace;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
 \r
 public class ControlFlowEntry implements ITimeGraphEntry, Comparable<ControlFlowEntry> {\r
+    private int fThreadQuark;\r
     private CtfKernelTrace fTrace;\r
-    private ITimeGraphEntry parent = null;\r
-    private ITimeGraphEntry[] children = null;\r
+    private ControlFlowEntry fParent = null;\r
+    private ArrayList<ControlFlowEntry> fChildren = new ArrayList<ControlFlowEntry>();\r
     private String fName;\r
     private int fThreadId;\r
     private int fPpid;\r
+    private long fBirthTime = -1;\r
     private long fStartTime = -1;\r
     private long fEndTime = -1;\r
-    List<ITimeEvent> list = new LinkedList<ITimeEvent>();\r
+    private List<ITimeEvent> fEventList = new ArrayList<ITimeEvent>();\r
+    private List<ITimeEvent> fZoomedEventList = null;\r
 \r
-    public ControlFlowEntry(CtfKernelTrace trace, String execName, int threadId, int ppid, long startTime, long endTime) {\r
+    public ControlFlowEntry(int threadQuark, CtfKernelTrace trace, String execName, int threadId, int ppid, long birthTime, long startTime, long endTime) {\r
+        fThreadQuark = threadQuark;\r
         fTrace = trace;\r
         fName = execName;\r
         fThreadId = threadId;\r
         fPpid = ppid;\r
+        fBirthTime = birthTime;\r
         fStartTime = startTime;\r
         fEndTime = endTime;\r
     }\r
 \r
     @Override\r
     public ITimeGraphEntry getParent() {\r
-        return parent;\r
+        return fParent;\r
     }\r
 \r
     @Override\r
     public boolean hasChildren() {\r
-        return children != null && children.length > 0;\r
+        return fChildren != null && fChildren.size() > 0;\r
     }\r
 \r
     @Override\r
-    public ITimeGraphEntry[] getChildren() {\r
-        return children;\r
+    public ControlFlowEntry[] getChildren() {\r
+        return fChildren.toArray(new ControlFlowEntry[0]);\r
     }\r
 \r
     @Override\r
@@ -60,43 +66,24 @@ public class ControlFlowEntry implements ITimeGraphEntry, Comparable<ControlFlow
         return fName;\r
     }\r
 \r
-    public int getThreadId() {\r
-        return fThreadId;\r
-    }\r
-\r
-    public int getPPID() {\r
-        return fPpid;\r
-    }\r
-\r
     @Override\r
     public long getStartTime() {\r
         return fStartTime;\r
     }\r
 \r
     @Override\r
-    public long getStopTime() {\r
+    public long getEndTime() {\r
         return fEndTime;\r
     }\r
 \r
     @Override\r
     public Iterator<ITimeEvent> getTimeEventsIterator() {\r
-        return list.iterator();\r
+        return new EventIterator(fEventList, fZoomedEventList);\r
     }\r
 \r
     @Override\r
     public Iterator<ITimeEvent> getTimeEventsIterator(long startTime, long stopTime, long visibleDuration) {\r
-        return getTimeEventsIterator();\r
-    }\r
-\r
-    public void addTraceEvent(ITimeEvent event) {\r
-        long time = event.getTime();\r
-        list.add(event);\r
-        if (fStartTime == -1 || time < fStartTime) {\r
-            fStartTime = time;\r
-        }\r
-        if (fEndTime == -1 || time > fEndTime) {\r
-            fEndTime = time;\r
-        }\r
+        return new EventIterator(fEventList, fZoomedEventList, startTime, stopTime);\r
     }\r
 \r
     @Override\r
@@ -108,4 +95,50 @@ public class ControlFlowEntry implements ITimeGraphEntry, Comparable<ControlFlow
         return result;\r
     }\r
 \r
+    public int getThreadQuark() {\r
+        return fThreadQuark;\r
+    }\r
+\r
+    public CtfKernelTrace getTrace() {\r
+        return fTrace;\r
+    }\r
+\r
+    public int getThreadId() {\r
+        return fThreadId;\r
+    }\r
+\r
+    public int getPPID() {\r
+        return fPpid;\r
+    }\r
+\r
+    public long getBirthTime() {\r
+        return fBirthTime;\r
+    }\r
+\r
+    public void addEvent(ITimeEvent event) {\r
+        long start = event.getTime();\r
+        long end = start + event.getDuration();\r
+        synchronized (fEventList) {\r
+            fEventList.add(event);\r
+            if (fStartTime == -1 || start < fStartTime) {\r
+                fStartTime = start;\r
+            }\r
+            if (fEndTime == -1 || end > fEndTime) {\r
+                fEndTime = end;\r
+            }\r
+        }\r
+    }\r
+\r
+    public void setEventList(List<ITimeEvent> eventList) {\r
+        fEventList = eventList;\r
+    }\r
+\r
+    public void setZoomedEventList(List<ITimeEvent> eventList) {\r
+        fZoomedEventList = eventList;\r
+    }\r
+\r
+    public void addChild(ControlFlowEntry child) {\r
+        child.fParent = this;\r
+        fChildren.add(child);\r
+    }\r
 }\r
index a7aa60526ed5f79534b7be50fe32b8b1c6cc5f2d..a9cebf95802fac55a64ee792c8e8a7811c090a03 100644 (file)
@@ -18,6 +18,9 @@ import java.util.HashMap;
 import java.util.List;\r
 import java.util.Map;\r
 \r
+import org.eclipse.jface.action.Action;\r
+import org.eclipse.jface.action.IToolBarManager;\r
+import org.eclipse.jface.action.Separator;\r
 import org.eclipse.jface.viewers.ILabelProviderListener;\r
 import org.eclipse.jface.viewers.ITableLabelProvider;\r
 import org.eclipse.jface.viewers.ITreeContentProvider;\r
@@ -25,32 +28,44 @@ import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Messages;\r
 import org.eclipse.linuxtools.lttng2.kernel.core.trace.Attributes;\r
 import org.eclipse.linuxtools.lttng2.kernel.core.trace.CtfKernelTrace;\r
+import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfTimestamp;\r
 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;\r
+import org.eclipse.linuxtools.tmf.core.event.TmfTimeRange;\r
+import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;\r
 import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException;\r
 import org.eclipse.linuxtools.tmf.core.exceptions.StateValueTypeException;\r
 import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException;\r
 import org.eclipse.linuxtools.tmf.core.experiment.TmfExperiment;\r
 import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval;\r
 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.TmfTimeSynchSignal;\r
 import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier;\r
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;\r
 import org.eclipse.linuxtools.tmf.ui.views.TmfView;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphRangeListener;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphSelectionListener;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphTimeListener;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.StateItem;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphCombo;\r
-import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphProvider;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphRangeUpdateEvent;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphSelectionEvent;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphTimeEvent;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeEvent;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils.Resolution;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat;\r
 import org.eclipse.swt.SWT;\r
 import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.graphics.RGB;\r
 import org.eclipse.swt.widgets.Composite;\r
 import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.swt.widgets.TreeColumn;\r
+import org.eclipse.ui.IActionBars;\r
 \r
 public class ControlFlowView extends TmfView {\r
 \r
@@ -63,23 +78,17 @@ public class ControlFlowView extends TmfView {
      */\r
     public static final String ID = "org.eclipse.linuxtools.lttng2.kernel.ui.views.controlflow"; //$NON-NLS-1$\r
 \r
-    private final String PROCESS_COLUMN    = Messages.ControlFlowView_processColumn;\r
-    private final String TID_COLUMN        = Messages.ControlFlowView_tidColumn;\r
-    private final String TGID_COLUMN       = Messages.ControlFlowView_tgidColumn;\r
-    private final String PPID_COLUMN       = Messages.ControlFlowView_ppidColumn;\r
-    private final String CPU_COLUMN        = Messages.ControlFlowView_cpuColumn;\r
-    private final String BIRTH_SEC_COLUMN  = Messages.ControlFlowView_birthSecColumn;\r
-    private final String BIRTH_NSEC_COLUMN = Messages.ControlFlowView_birthNsecColumn;\r
-    private final String TRACE_COLUMN      = Messages.ControlFlowView_traceColumn;\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 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
-            TGID_COLUMN,\r
             PPID_COLUMN,\r
-            CPU_COLUMN,\r
-            BIRTH_SEC_COLUMN,\r
-            BIRTH_NSEC_COLUMN,\r
+            BIRTH_TIME_COLUMN,\r
             TRACE_COLUMN\r
     };\r
 \r
@@ -94,7 +103,7 @@ public class ControlFlowView extends TmfView {
     private TmfExperiment<ITmfEvent> fSelectedExperiment;\r
 \r
     // The timegraph entry list\r
-    private ArrayList<ITimeGraphEntry> fEntryList;\r
+    private ArrayList<ControlFlowEntry> fEntryList;\r
 \r
     // The start time\r
     private long fStartTime;\r
@@ -102,6 +111,18 @@ public class ControlFlowView extends TmfView {
     // The end time\r
     private long fEndTime;\r
 \r
+    // The display width\r
+    private int fDisplayWidth;\r
+\r
+    // The zoom thread\r
+    private ZoomThread fZoomThread;\r
+    \r
+    // The next resource action\r
+    private Action fNextResourceAction;\r
+    \r
+    // The previous resource action\r
+    private Action fPreviousResourceAction;\r
+\r
     // ------------------------------------------------------------------------\r
     // Classes\r
     // ------------------------------------------------------------------------\r
@@ -172,22 +193,70 @@ public class ControlFlowView extends TmfView {
                 return entry.getName();\r
             } else if (columnIndex == 1) {\r
                 return Integer.toString(entry.getThreadId());\r
-            } else if (columnIndex == 3) {\r
-                if (entry.getPPID() != -1) {\r
+            } else if (columnIndex == 2) {\r
+                if (entry.getPPID() > 0) {\r
                     return Integer.toString(entry.getPPID());\r
                 }\r
+            } else if (columnIndex == 3) {\r
+                return Utils.formatTime(entry.getBirthTime(), TimeFormat.ABSOLUTE, Resolution.NANOSEC);\r
+            } else if (columnIndex == 4) {\r
+                return entry.getTrace().getName();\r
             }\r
             return ""; //$NON-NLS-1$\r
         }\r
         \r
     }\r
 \r
+    private class ZoomThread extends Thread {\r
+        private long fStartTime;\r
+        private long fEndTime;\r
+        private long fResolution;\r
+        private boolean fCancelled = false;\r
+\r
+        public ZoomThread(long startTime, long endTime) {\r
+            super("ControlFlowView zoom"); //$NON-NLS-1$\r
+            fStartTime = startTime;\r
+            fEndTime = endTime;\r
+            fResolution = Math.max(1, (fEndTime - fStartTime) / fDisplayWidth);\r
+        }\r
+\r
+        @Override\r
+        public void run() {\r
+            if (fEntryList == null) {\r
+                return;\r
+            }\r
+            for (ControlFlowEntry entry : fEntryList) {\r
+                if (fCancelled) {\r
+                    return;\r
+                }\r
+                zoom(entry);\r
+            }\r
+            redraw();\r
+        }\r
+\r
+        private void zoom(ControlFlowEntry entry) {\r
+            List<ITimeEvent> zoomedEventList = getEventList(entry, fStartTime, fEndTime, fResolution);\r
+            entry.setZoomedEventList(zoomedEventList);\r
+            for (ControlFlowEntry child : entry.getChildren()) {\r
+                if (fCancelled) {\r
+                    return;\r
+                }\r
+                zoom(child);\r
+            }\r
+        }\r
+\r
+        public void cancel() {\r
+            fCancelled = true;\r
+        }\r
+    }\r
+\r
     // ------------------------------------------------------------------------\r
     // Constructors\r
     // ------------------------------------------------------------------------\r
 \r
     public ControlFlowView() {\r
         super(ID);\r
+        fDisplayWidth = Display.getDefault().getBounds().width;\r
     }\r
 \r
     // ------------------------------------------------------------------------\r
@@ -205,30 +274,66 @@ public class ControlFlowView extends TmfView {
 \r
         fTimeGraphCombo.setTreeLabelProvider(new TreeLabelProvider());\r
 \r
-        fTimeGraphCombo.setTimeGraphProvider(new TimeGraphProvider() {\r
-            @Override\r
-            public String getTraceClassName(ITimeGraphEntry trace) {\r
-                return "trace class"; //$NON-NLS-1$\r
+        fTimeGraphCombo.setTimeGraphProvider(new TimeGraphPresentationProvider() {\r
+            private static final String UNKNOWN = "UNKNOWN"; //$NON-NLS-1$\r
+            private static final String WAIT = "WAIT"; //$NON-NLS-1$\r
+            private static final String USERMODE = "USERMODE"; //$NON-NLS-1$\r
+            private static final String SYSCALL = "SYSCALL"; //$NON-NLS-1$\r
+            private static final String INTERRUPTED = "INTERRUPTED"; //$NON-NLS-1$\r
+\r
+            @Override \r
+            public String getStateTypeName() {\r
+                return Messages.ControlFlowView_stateTypeName;\r
             }\r
             \r
             @Override\r
-            public String getStateName(StateColor color) {\r
-                return "state name"; //$NON-NLS-1$\r
+            public StateItem[] getStateTable() {\r
+                return new StateItem[] {\r
+                        new StateItem(new RGB(100, 100, 100), UNKNOWN),\r
+                        new StateItem(new RGB(150, 150, 0), WAIT),\r
+                        new StateItem(new RGB(0, 200, 0), USERMODE),\r
+                        new StateItem(new RGB(0, 0, 200), SYSCALL),\r
+                        new StateItem(new RGB(200, 100, 100), INTERRUPTED)\r
+                };\r
             }\r
-            \r
+\r
             @Override\r
-            public String getEventName(ITimeEvent event, boolean upper, boolean extInfo) {\r
-                return "event name"; //$NON-NLS-1$\r
+            public int getEventTableIndex(ITimeEvent event) {\r
+                if (event instanceof ControlFlowEvent) {\r
+                    int status = ((ControlFlowEvent) event).getStatus();\r
+                    if (status == Attributes.STATUS_WAIT) {\r
+                        return 1;\r
+                    } else if (status == Attributes.STATUS_RUN_USERMODE) {\r
+                        return 2;\r
+                    } else if (status == Attributes.STATUS_RUN_SYSCALL) {\r
+                        return 3;\r
+                    } else if (status == Attributes.STATUS_INTERRUPTED) {\r
+                        return 4;\r
+                    }\r
+                }\r
+                return 0;\r
             }\r
-            \r
+\r
             @Override\r
-            public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event) {\r
-                return new HashMap<String, String>();\r
+            public String getEventName(ITimeEvent event) {\r
+                if (event instanceof ControlFlowEvent) {\r
+                    int status = ((ControlFlowEvent) event).getStatus();\r
+                    if (status == Attributes.STATUS_WAIT) {\r
+                        return WAIT;\r
+                    } else if (status == Attributes.STATUS_RUN_USERMODE) {\r
+                        return USERMODE;\r
+                    } else if (status == Attributes.STATUS_RUN_SYSCALL) {\r
+                        return SYSCALL;\r
+                    } else if (status == Attributes.STATUS_INTERRUPTED) {\r
+                        return INTERRUPTED;\r
+                    }\r
+                }\r
+                return UNKNOWN;\r
             }\r
             \r
             @Override\r
-            public StateColor getEventColor(ITimeEvent event) {\r
-                return StateColor.BLACK;\r
+            public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event) {\r
+                return new HashMap<String, String>();\r
             }\r
         });\r
 \r
@@ -237,9 +342,16 @@ public class ControlFlowView extends TmfView {
         fTimeGraphCombo.getTimeGraphViewer().addRangeListener(new ITimeGraphRangeListener() {\r
             @Override\r
             public void timeRangeUpdated(TimeGraphRangeUpdateEvent event) {\r
-                long startTime = event.getStartTime();\r
-                long endTime = event.getEndTime();\r
-                System.out.println("timeRangeUpdated: startTime="+startTime+" endTime="+endTime);\r
+                final long startTime = event.getStartTime();\r
+                final long endTime = event.getEndTime();\r
+                TmfTimeRange range = new TmfTimeRange(new CtfTmfTimestamp(startTime), new CtfTmfTimestamp(endTime));\r
+                TmfTimestamp time = new CtfTmfTimestamp(fTimeGraphCombo.getTimeGraphViewer().getSelectedTime());\r
+                broadcast(new TmfRangeSynchSignal(ControlFlowView.this, range, time));\r
+                if (fZoomThread != null) {\r
+                    fZoomThread.cancel();\r
+                }\r
+                fZoomThread = new ZoomThread(startTime, endTime);\r
+                fZoomThread.start();\r
             }\r
         });\r
 \r
@@ -247,19 +359,20 @@ public class ControlFlowView extends TmfView {
             @Override\r
             public void timeSelected(TimeGraphTimeEvent event) {\r
                 long time = event.getTime();\r
-                System.out.println("timeSelected: time="+time);\r
+                broadcast(new TmfTimeSynchSignal(ControlFlowView.this, new CtfTmfTimestamp(time)));\r
             }\r
         });\r
 \r
         fTimeGraphCombo.addSelectionListener(new ITimeGraphSelectionListener() {\r
             @Override\r
             public void selectionChanged(TimeGraphSelectionEvent event) {\r
-                ITimeGraphEntry selection = event.getSelection();\r
-                System.out.println("selectionChanged: source="+event.getSource()+" selection="+ (selection == null ? selection : selection.getName()));\r
+                //ITimeGraphEntry selection = event.getSelection();\r
             }\r
         });\r
 \r
-        final Thread thread = new Thread() {\r
+        fTimeGraphCombo.getTimeGraphViewer().setTimeCalendarFormat(true);\r
+\r
+        final Thread thread = new Thread("ControlFlowView build") { //$NON-NLS-1$\r
             @Override\r
             public void run() {\r
                 if (TmfExperiment.getCurrentExperiment() != null) {\r
@@ -268,6 +381,10 @@ public class ControlFlowView extends TmfView {
             }\r
         };\r
         thread.start();\r
+        \r
+        // View Action Handling\r
+        makeActions();\r
+        contributeToActionBars();\r
     }\r
 \r
     /* (non-Javadoc)\r
@@ -288,26 +405,65 @@ public class ControlFlowView extends TmfView {
             return;\r
         }\r
 \r
-        final Thread thread = new Thread() {\r
+        final Thread thread = new Thread("ControlFlowView build") { //$NON-NLS-1$\r
             @Override\r
             public void run() {\r
                 selectExperiment(signal.getExperiment());\r
             }};\r
-        thread.run();\r
+        thread.start();\r
+    }\r
+\r
+    @TmfSignalHandler\r
+    public void synchToTime(final TmfTimeSynchSignal signal) {\r
+        if (signal.getSource() == this) {\r
+            return;\r
+        }\r
+        final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
+        Display.getDefault().asyncExec(new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                if (fTimeGraphCombo.isDisposed()) {\r
+                    return;\r
+                }\r
+                fTimeGraphCombo.getTimeGraphViewer().setSelectedTime(time, true, signal.getSource());\r
+            }\r
+        });\r
+    }\r
+\r
+    @TmfSignalHandler\r
+    public void synchToRange(final TmfRangeSynchSignal signal) {\r
+        if (signal.getSource() == this) {\r
+            return;\r
+        }\r
+        final long startTime = signal.getCurrentRange().getStartTime().normalize(0, -9).getValue();\r
+        final long endTime = signal.getCurrentRange().getEndTime().normalize(0, -9).getValue();\r
+        final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
+        Display.getDefault().asyncExec(new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                if (fTimeGraphCombo.isDisposed()) {\r
+                    return;\r
+                }\r
+                fTimeGraphCombo.getTimeGraphViewer().setStartFinishTime(startTime, endTime);\r
+                fTimeGraphCombo.getTimeGraphViewer().setSelectedTime(time, false, signal.getSource());\r
+            }\r
+        });\r
     }\r
 \r
+    // ------------------------------------------------------------------------\r
+    // Internal\r
+    // ------------------------------------------------------------------------\r
+\r
     @SuppressWarnings("unchecked")\r
     private void selectExperiment(TmfExperiment<?> experiment) {\r
         fStartTime = Long.MAX_VALUE;\r
         fEndTime = Long.MIN_VALUE;\r
         fSelectedExperiment = (TmfExperiment<ITmfEvent>) experiment;\r
-        HashMap<String, ITimeGraphEntry> traces = new HashMap<String, ITimeGraphEntry>();\r
-        fEntryList = new ArrayList<ITimeGraphEntry>();\r
+        fEntryList = new ArrayList<ControlFlowEntry>();\r
         for (ITmfTrace<?> trace : experiment.getTraces()) {\r
             if (trace instanceof CtfKernelTrace) {\r
                 CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace;\r
                 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
-                ControlFlowEntry swapperEntry = null;\r
                 long start = ssq.getStartTime();\r
                 long end = ssq.getCurrentEndTime();\r
                 fStartTime = Math.min(fStartTime, start);\r
@@ -321,6 +477,9 @@ public class ControlFlowView extends TmfView {
                     } catch (NumberFormatException e1) {\r
                         continue;\r
                     }\r
+                    if (threadId == 0) { // ignore the swapper thread\r
+                        continue;\r
+                    }\r
                     int execNameQuark = -1;\r
                     try {\r
                         try {\r
@@ -330,28 +489,25 @@ public class ControlFlowView extends TmfView {
                         }\r
                         int ppidQuark = ssq.getQuarkRelative(threadQuark, Attributes.PPID);\r
                         List<ITmfStateInterval> execNameIntervals = ssq.queryHistoryRange(execNameQuark, start, end);\r
+                        long birthTime = -1;\r
                         for (ITmfStateInterval execNameInterval : execNameIntervals) {\r
                             if (!execNameInterval.getStateValue().isNull() && execNameInterval.getStateValue().getType() == 1) {\r
                                 String execName = execNameInterval.getStateValue().unboxStr();\r
                                 long startTime = execNameInterval.getStartTime();\r
-                                long endTime = execNameInterval.getEndTime();\r
+                                long endTime = execNameInterval.getEndTime() + 1;\r
+                                if (birthTime == -1) {\r
+                                    birthTime = startTime;\r
+                                }\r
                                 int ppid = -1;\r
                                 if (ppidQuark != -1) {\r
                                     ITmfStateInterval ppidInterval = ssq.querySingleState(startTime, ppidQuark);\r
                                     ppid = ppidInterval.getStateValue().unboxInt();\r
                                 }\r
-                                ControlFlowEntry entry;\r
-                                if (threadId == 0) {\r
-                                    if (swapperEntry == null) {\r
-                                        swapperEntry = new ControlFlowEntry(ctfKernelTrace, "swapper", threadId, ppid, startTime, endTime);\r
-                                        fEntryList.add(swapperEntry);\r
-                                    }\r
-                                    entry = swapperEntry;\r
-                                } else {\r
-                                    entry = new ControlFlowEntry(ctfKernelTrace, execName, threadId, ppid, startTime, endTime);\r
-                                    fEntryList.add(entry);\r
-                                }\r
-                                entry.addTraceEvent(new TimeEvent(entry, startTime, endTime - startTime));\r
+                                ControlFlowEntry entry = new ControlFlowEntry(threadQuark, ctfKernelTrace, execName, threadId, ppid, birthTime, startTime, endTime);\r
+                                fEntryList.add(entry);\r
+                                entry.addEvent(new TimeEvent(entry, startTime, endTime - startTime));\r
+                            } else {\r
+                                birthTime = -1;\r
                             }\r
                         }\r
                     } catch (AttributeNotFoundException e) {\r
@@ -363,8 +519,85 @@ public class ControlFlowView extends TmfView {
                     }\r
                 }\r
             }\r
+            buildTree();\r
             refresh();\r
+            ControlFlowEntry[] entries = fEntryList.toArray(new ControlFlowEntry[0]);\r
+            Arrays.sort(entries);\r
+            for (ControlFlowEntry entry : entries) {\r
+                buildStatusEvents(entry);\r
+            }\r
+        }\r
+    }\r
+\r
+    private void buildTree() {\r
+        ArrayList<ControlFlowEntry> rootList = new ArrayList<ControlFlowEntry>();\r
+        for (ControlFlowEntry entry : fEntryList) {\r
+            boolean root = true;\r
+            if (entry.getPPID() > 0) {\r
+                for (ControlFlowEntry parent : fEntryList) {\r
+                    if (parent.getThreadId() == entry.getPPID() &&\r
+                            entry.getStartTime() >= parent.getStartTime() &&\r
+                            entry.getStartTime() <= parent.getEndTime()) {\r
+                        parent.addChild(entry);\r
+                        root = false;\r
+                        break;\r
+                    }\r
+                }\r
+            }\r
+            if (root) {\r
+                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 resolution = Math.max(1, (end - start) / fDisplayWidth);\r
+        List<ITimeEvent> eventList = getEventList(entry, entry.getStartTime(), entry.getEndTime(), resolution);\r
+        entry.setEventList(eventList);\r
+        redraw();\r
+        for (ITimeGraphEntry child : entry.getChildren()) {\r
+            buildStatusEvents((ControlFlowEntry) child);\r
+        }\r
+    }\r
+\r
+    private List<ITimeEvent> getEventList(ControlFlowEntry entry, long startTime, long endTime, long resolution) {\r
+        startTime = Math.max(startTime, entry.getStartTime());\r
+        endTime = Math.min(endTime, entry.getEndTime());\r
+        if (endTime <= startTime) {\r
+            return null;\r
+        }\r
+        IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
+        List<ITimeEvent> eventList = null;\r
+        try {\r
+            int statusQuark = ssq.getQuarkRelative(entry.getThreadQuark(), Attributes.STATUS);\r
+            List<ITmfStateInterval> statusIntervals = ssq.queryHistoryRange(statusQuark, startTime, endTime - 1, resolution);\r
+            eventList = new ArrayList<ITimeEvent>(statusIntervals.size());\r
+            long lastEndTime = -1;\r
+            for (ITmfStateInterval statusInterval : statusIntervals) {\r
+                long time = statusInterval.getStartTime();\r
+                long duration = statusInterval.getEndTime() - time + 1;\r
+                int status = -1;\r
+                try {\r
+                    status = statusInterval.getStateValue().unboxInt();\r
+                } catch (StateValueTypeException e) {\r
+                    e.printStackTrace();\r
+                }\r
+                if (lastEndTime != time && lastEndTime != -1) {\r
+                    eventList.add(new ControlFlowEvent(entry, lastEndTime, time - lastEndTime, 0));\r
+                }\r
+                eventList.add(new ControlFlowEvent(entry, time, duration, status));\r
+                lastEndTime = time + duration;\r
+            }\r
+        } catch (AttributeNotFoundException e) {\r
+            e.printStackTrace();\r
+        } catch (TimeRangeException e) {\r
+            e.printStackTrace();\r
+        }\r
+        return eventList;\r
     }\r
 \r
     private void refresh() {\r
@@ -379,8 +612,50 @@ public class ControlFlowView extends TmfView {
                 fTimeGraphCombo.setInput(entries);\r
                 fTimeGraphCombo.getTimeGraphViewer().setTimeBounds(fStartTime, fEndTime);\r
                 fTimeGraphCombo.getTimeGraphViewer().setStartFinishTime(fStartTime, fEndTime);\r
+                for (TreeColumn column : fTimeGraphCombo.getTreeViewer().getTree().getColumns()) {\r
+                    column.pack();\r
+                }\r
+            }\r
+        });\r
+    }\r
+\r
+    private void redraw() {\r
+        Display.getDefault().asyncExec(new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                if (fTimeGraphCombo.isDisposed()) {\r
+                    return;\r
+                }\r
+                fTimeGraphCombo.redraw();\r
+                fTimeGraphCombo.update();\r
             }\r
         });\r
     }\r
 \r
+    private void makeActions() {\r
+        fPreviousResourceAction = fTimeGraphCombo.getTimeGraphViewer().getPreviousItemAction();\r
+        fPreviousResourceAction.setText(Messages.ControlFlowView_previousProcessActionNameText);\r
+        fPreviousResourceAction.setToolTipText(Messages.ControlFlowView_previousProcessActionToolTipText);\r
+        fNextResourceAction = fTimeGraphCombo.getTimeGraphViewer().getNextItemAction();\r
+        fNextResourceAction.setText(Messages.ControlFlowView_nextProcessActionNameText);\r
+        fNextResourceAction.setToolTipText(Messages.ControlFlowView_nextProcessActionToolTipText);\r
+    }\r
+    \r
+    private void contributeToActionBars() {\r
+        IActionBars bars = getViewSite().getActionBars();\r
+        fillLocalToolBar(bars.getToolBarManager());\r
+    }\r
+\r
+    private void fillLocalToolBar(IToolBarManager manager) {\r
+        manager.add(fTimeGraphCombo.getTimeGraphViewer().getShowLegendAction());\r
+        manager.add(new Separator());\r
+        manager.add(fTimeGraphCombo.getTimeGraphViewer().getResetScaleAction());\r
+        manager.add(fTimeGraphCombo.getTimeGraphViewer().getPreviousEventAction());\r
+        manager.add(fTimeGraphCombo.getTimeGraphViewer().getNextEventAction());\r
+        manager.add(fPreviousResourceAction);\r
+        manager.add(fNextResourceAction);\r
+        manager.add(fTimeGraphCombo.getTimeGraphViewer().getZoomInAction());\r
+        manager.add(fTimeGraphCombo.getTimeGraphViewer().getZoomOutAction());\r
+        manager.add(new Separator());\r
+    }\r
 }\r
index 39b17a0383270e5d4f9fdb90d9ce9a4d840afa55..6a67d2e3dd85297d3a0d17914af8fa8aea3511e5 100644 (file)
 \r
 package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources;\r
 \r
+import java.util.ArrayList;\r
 import java.util.Iterator;\r
-import java.util.LinkedList;\r
 import java.util.List;\r
 \r
+import org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.common.EventIterator;\r
 import org.eclipse.linuxtools.lttng2.kernel.core.trace.CtfKernelTrace;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
 \r
 public class ResourcesEntry implements ITimeGraphEntry {\r
+    public static enum Type { NULL, CPU, IRQ, SOFT_IRQ };\r
+\r
+    private int fQuark;\r
     private CtfKernelTrace fTrace;\r
     private ITimeGraphEntry fParent = null;\r
     private ITimeGraphEntry[] children = null;\r
     private String fName;\r
+    private Type fType;\r
+    private int fId;\r
     private long fStartTime;\r
     private long fEndTime;\r
-    List<ITimeEvent> list = new LinkedList<ITimeEvent>();\r
+    private List<ITimeEvent> fEventList = new ArrayList<ITimeEvent>();\r
+    private List<ITimeEvent> fZoomedEventList = null;\r
 \r
-    public ResourcesEntry(ITimeGraphEntry parent, CtfKernelTrace trace, String cpuName) {\r
-        fParent = parent;\r
+    public ResourcesEntry(int quark, CtfKernelTrace trace, Type type, int id) {\r
+        fQuark = quark;\r
         fTrace = trace;\r
-        fName = cpuName;\r
+        fType = type;\r
+        fId = id;\r
+        fName = type.toString() + ' ' + Integer.toString(id);\r
     }\r
 \r
     @Override\r
@@ -61,28 +70,50 @@ public class ResourcesEntry implements ITimeGraphEntry {
     }\r
 \r
     @Override\r
-    public long getStopTime() {\r
+    public long getEndTime() {\r
         return fEndTime;\r
     }\r
 \r
     @Override\r
     public Iterator<ITimeEvent> getTimeEventsIterator() {\r
-        return list.iterator();\r
+        return new EventIterator(fEventList, fZoomedEventList);\r
     }\r
 \r
     @Override\r
     public Iterator<ITimeEvent> getTimeEventsIterator(long startTime, long stopTime, long visibleDuration) {\r
-        return getTimeEventsIterator();\r
+        return new EventIterator(fEventList, fZoomedEventList, startTime, stopTime);\r
     }\r
 \r
-    public void addTraceEvent(ITimeEvent event) {\r
-        long time = event.getTime();\r
-        list.add(event);\r
-        if (fStartTime == -1 || time < fStartTime) {\r
-            fStartTime = time;\r
-        }\r
-        if (fEndTime == -1 || time > fEndTime) {\r
-            fEndTime = time;\r
+    public void setParent(ITimeGraphEntry parent) {\r
+        fParent = parent;\r
+    }\r
+\r
+    public int getQuark() {\r
+        return fQuark;\r
+    }\r
+\r
+    public CtfKernelTrace getTrace() {\r
+        return fTrace;\r
+    }\r
+\r
+    public Type getType() {\r
+        return fType;\r
+    }\r
+\r
+    public int getId() {\r
+        return fId;\r
+    }\r
+\r
+    public void setEventList(List<ITimeEvent> eventList) {\r
+        fEventList = eventList;\r
+        if (eventList != null && eventList.size() > 0) {\r
+            fStartTime = eventList.get(0).getTime();\r
+            ITimeEvent lastEvent = eventList.get(eventList.size() - 1);\r
+            fEndTime = lastEvent.getTime() + lastEvent.getDuration();\r
         }\r
     }\r
+\r
+    public void setZoomedEventList(List<ITimeEvent> eventList) {\r
+        fZoomedEventList = eventList;\r
+    }\r
 }\r
index 51445dbbb668eeea42377ebc0fb3231de8eb1765..d29d99de88285d127e7857ce90b9a2f894ecd2ee 100644 (file)
 package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources;\r
 \r
 import java.util.ArrayList;\r
+import java.util.Arrays;\r
 import java.util.HashMap;\r
 import java.util.Iterator;\r
 import java.util.List;\r
 import java.util.Map;\r
 \r
+import org.eclipse.jface.action.Action;\r
+import org.eclipse.jface.action.IToolBarManager;\r
+import org.eclipse.jface.action.Separator;\r
+import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Messages;\r
+import org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources.ResourcesEntry.Type;\r
 import org.eclipse.linuxtools.lttng2.kernel.core.trace.Attributes;\r
 import org.eclipse.linuxtools.lttng2.kernel.core.trace.CtfKernelTrace;\r
+import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfTimestamp;\r
 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;\r
 import org.eclipse.linuxtools.tmf.core.event.TmfEvent;\r
+import org.eclipse.linuxtools.tmf.core.event.TmfTimeRange;\r
+import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;\r
 import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException;\r
 import org.eclipse.linuxtools.tmf.core.exceptions.StateValueTypeException;\r
 import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException;\r
 import org.eclipse.linuxtools.tmf.core.experiment.TmfExperiment;\r
 import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval;\r
 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.TmfTimeSynchSignal;\r
 import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier;\r
 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;\r
 import org.eclipse.linuxtools.tmf.ui.views.TmfView;\r
-import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphProvider;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphRangeListener;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphTimeListener;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.StateItem;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphRangeUpdateEvent;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphTimeEvent;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphViewer;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeEvent;\r
 import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.RGB;\r
 import org.eclipse.swt.widgets.Composite;\r
 import org.eclipse.swt.widgets.Display;\r
+import org.eclipse.ui.IActionBars;\r
 \r
 public class ResourcesView extends TmfView {\r
 \r
@@ -63,7 +81,7 @@ public class ResourcesView extends TmfView {
     private TmfExperiment<ITmfEvent> fSelectedExperiment;\r
 \r
     // The time graph entry list\r
-    private ArrayList<ITimeGraphEntry> fEntryList;\r
+    private ArrayList<TraceEntry> fEntryList;\r
 \r
     // The start time\r
     private long fStartTime;\r
@@ -73,25 +91,35 @@ public class ResourcesView extends TmfView {
 \r
     // The display width\r
     private int fDisplayWidth;\r
+    \r
+    // The next resource action\r
+    private Action fNextResourceAction;\r
+    \r
+    // The previous resource action\r
+    private Action fPreviousResourceAction;\r
+\r
+\r
+    // The zoom thread\r
+    private ZoomThread fZoomThread;\r
 \r
     // ------------------------------------------------------------------------\r
     // Classes\r
     // ------------------------------------------------------------------------\r
 \r
-    private class GroupEntry implements ITimeGraphEntry {\r
-        public ITimeGraphEntry fParent;\r
-        public ArrayList<ITimeGraphEntry> fChildren;\r
+    private class TraceEntry implements ITimeGraphEntry {\r
+        private CtfKernelTrace fTrace;\r
+        public ArrayList<ResourcesEntry> fChildren;\r
         public String fName;\r
 \r
-        public GroupEntry(ITimeGraphEntry parent, String name) {\r
-            fParent = parent;\r
-            fChildren = new ArrayList<ITimeGraphEntry>();\r
+        public TraceEntry(CtfKernelTrace trace, String name) {\r
+            fTrace = trace;\r
+            fChildren = new ArrayList<ResourcesEntry>();\r
             fName = name;\r
         }\r
 \r
         @Override\r
         public ITimeGraphEntry getParent() {\r
-            return fParent;\r
+            return null;\r
         }\r
 \r
         @Override\r
@@ -100,8 +128,8 @@ public class ResourcesView extends TmfView {
         }\r
 \r
         @Override\r
-        public ITimeGraphEntry[] getChildren() {\r
-            return fChildren.toArray(new ITimeGraphEntry[0]);\r
+        public ResourcesEntry[] getChildren() {\r
+            return fChildren.toArray(new ResourcesEntry[0]);\r
         }\r
 \r
         @Override\r
@@ -115,7 +143,7 @@ public class ResourcesView extends TmfView {
         }\r
 \r
         @Override\r
-        public long getStopTime() {\r
+        public long getEndTime() {\r
             return -1;\r
         }\r
 \r
@@ -129,8 +157,59 @@ public class ResourcesView extends TmfView {
             return null;\r
         }\r
 \r
-        public void addChild(ITimeGraphEntry entry) {\r
-            fChildren.add(entry);\r
+        public CtfKernelTrace getTrace() {\r
+            return fTrace;\r
+        }\r
+\r
+        public void addChild(ResourcesEntry entry) {\r
+            int index;\r
+            for (index = 0; index < fChildren.size(); index++) {\r
+                ResourcesEntry other = fChildren.get(index);\r
+                if (entry.getType().compareTo(other.getType()) < 0) {\r
+                    break;\r
+                } else if (entry.getType().equals(other.getType())) {\r
+                    if (entry.getId() < other.getId()) {\r
+                        break;\r
+                    }\r
+                }\r
+            }\r
+            entry.setParent(this);\r
+            fChildren.add(index, entry);\r
+        }\r
+    }\r
+\r
+    private class ZoomThread extends Thread {\r
+        private long fStartTime;\r
+        private long fEndTime;\r
+        private boolean fCancelled = false;\r
+\r
+        public ZoomThread(long startTime, long endTime) {\r
+            super("ResourcesView zoom"); //$NON-NLS-1$\r
+            fStartTime = startTime;\r
+            fEndTime = endTime;\r
+        }\r
+\r
+        @Override\r
+        public void run() {\r
+            if (fEntryList == null) {\r
+                return;\r
+            }\r
+            long resolution = Math.max(1, (fEndTime - fStartTime) / fDisplayWidth);\r
+            for (TraceEntry traceEntry : fEntryList) {\r
+                for (ITimeGraphEntry child : traceEntry.getChildren()) {\r
+                    ResourcesEntry entry = (ResourcesEntry) child;\r
+                    if (fCancelled) {\r
+                        break;\r
+                    }\r
+                    List<ITimeEvent> zoomedEventList = getEventList(entry, fStartTime, fEndTime, resolution, true);\r
+                    entry.setZoomedEventList(zoomedEventList);\r
+                    redraw();\r
+                }\r
+            }\r
+        }\r
+\r
+        public void cancel() {\r
+            fCancelled = true;\r
         }\r
     }\r
 \r
@@ -154,20 +233,41 @@ public class ResourcesView extends TmfView {
     public void createPartControl(Composite parent) {\r
         fTimeGraphViewer = new TimeGraphViewer(parent, SWT.NONE);\r
 \r
-        fTimeGraphViewer.setTimeGraphProvider(new TimeGraphProvider() {\r
-            @Override\r
-            public String getTraceClassName(ITimeGraphEntry trace) {\r
-                return "trace class"; //$NON-NLS-1$\r
-            }\r
-            \r
-            @Override\r
-            public String getStateName(StateColor color) {\r
-                return "state name"; //$NON-NLS-1$\r
+        fTimeGraphViewer.setTimeGraphProvider(new TimeGraphPresentationProvider() {\r
+            private static final String UNKNOWN = "UNKNOWN"; //$NON-NLS-1$\r
+            private static final String IDLE = "IDLE"; //$NON-NLS-1$\r
+            private static final String BUSY = "BUSY"; //$NON-NLS-1$\r
+            private static final String INTERRUPTED = "INTERRUPTED"; //$NON-NLS-1$\r
+            private static final String RAISED = "RAISED"; //$NON-NLS-1$\r
+            private static final String ACTIVE = "ACTIVE"; //$NON-NLS-1$\r
+\r
+            @Override \r
+            public String getStateTypeName() {\r
+                return Messages.ResourcesView_stateTypeName;\r
             }\r
             \r
             @Override\r
-            public String getEventName(ITimeEvent event, boolean upper, boolean extInfo) {\r
-                return "event name"; //$NON-NLS-1$\r
+            public String getEventName(ITimeEvent event) {\r
+                if (event instanceof ResourcesEvent) {\r
+                    ResourcesEvent resourcesEvent = (ResourcesEvent) event;\r
+                    if (resourcesEvent.getType() == Type.CPU) {\r
+                        int currentThread = resourcesEvent.getValue();\r
+                        if (currentThread == 0) {\r
+                            return IDLE;\r
+                        } else {\r
+                            return BUSY;\r
+                        }\r
+                    } else if (resourcesEvent.getType() == Type.IRQ || resourcesEvent.getType() == Type.SOFT_IRQ) {\r
+                        int cpu = resourcesEvent.getValue();\r
+                        if (cpu == Attributes.SOFT_IRQ_RAISED) {\r
+                            return RAISED;\r
+                        }\r
+                        return ACTIVE;\r
+                    } else {\r
+                        return null;\r
+                    }\r
+                }\r
+                return UNKNOWN;\r
             }\r
             \r
             @Override\r
@@ -176,16 +276,69 @@ public class ResourcesView extends TmfView {
             }\r
             \r
             @Override\r
-            public StateColor getEventColor(ITimeEvent event) {\r
-                if (event.getTime() % 2 == 0) {\r
-                    return StateColor.BLACK;\r
-                } else {\r
-                    return StateColor.GRAY;\r
+            public StateItem[] getStateTable() {\r
+                return new StateItem[] {\r
+                        new StateItem(new RGB(100, 100, 100), UNKNOWN),\r
+                        new StateItem(new RGB(200, 200, 200), IDLE),\r
+                        new StateItem(new RGB(0, 200, 0), BUSY),\r
+                        new StateItem(new RGB(200, 100, 100), INTERRUPTED),\r
+                        new StateItem(new RGB(200, 200, 0), RAISED),\r
+                        new StateItem(new RGB(200, 100, 100), ACTIVE)\r
+                };\r
+            }\r
+\r
+            @Override\r
+            public int getEventTableIndex(ITimeEvent event) {\r
+                if (event instanceof ResourcesEvent) {\r
+                    ResourcesEvent resourcesEvent = (ResourcesEvent) event;\r
+                    if (resourcesEvent.getType() == Type.CPU) {\r
+                        int currentThread = resourcesEvent.getValue();\r
+                        if (currentThread == 0) {\r
+                            return 1; // IDLE\r
+                        } else {\r
+                            return 2; // BUSY\r
+                        }\r
+                    } else if (resourcesEvent.getType() == Type.IRQ || resourcesEvent.getType() == Type.SOFT_IRQ) {\r
+                        int cpu = resourcesEvent.getValue();\r
+                        if (cpu == Attributes.SOFT_IRQ_RAISED) {\r
+                            return 4; // RAISED\r
+                        }\r
+                        return 5; // ACTIVE\r
+                    } else {\r
+                        return -1; // NULL\r
+                    }\r
+                }\r
+                return 0; // UNKNOWN\r
+            }\r
+        });\r
+\r
+        fTimeGraphViewer.setTimeCalendarFormat(true);\r
+\r
+        fTimeGraphViewer.addRangeListener(new ITimeGraphRangeListener() {\r
+            @Override\r
+            public void timeRangeUpdated(TimeGraphRangeUpdateEvent event) {\r
+                long startTime = event.getStartTime();\r
+                long endTime = event.getEndTime();\r
+                TmfTimeRange range = new TmfTimeRange(new CtfTmfTimestamp(startTime), new CtfTmfTimestamp(endTime));\r
+                TmfTimestamp time = new CtfTmfTimestamp(fTimeGraphViewer.getSelectedTime());\r
+                broadcast(new TmfRangeSynchSignal(ResourcesView.this, range, time));\r
+                if (fZoomThread != null) {\r
+                    fZoomThread.cancel();\r
                 }\r
+                fZoomThread = new ZoomThread(startTime, endTime);\r
+                fZoomThread.start();\r
             }\r
         });\r
 \r
-        final Thread thread = new Thread() {\r
+        fTimeGraphViewer.addTimeListener(new ITimeGraphTimeListener() {\r
+            @Override\r
+            public void timeSelected(TimeGraphTimeEvent event) {\r
+                long time = event.getTime();\r
+                broadcast(new TmfTimeSynchSignal(ResourcesView.this, new CtfTmfTimestamp(time)));\r
+            }\r
+        });\r
+\r
+        final Thread thread = new Thread("ResourcesView build") { //$NON-NLS-1$\r
             @Override\r
             public void run() {\r
                 if (TmfExperiment.getCurrentExperiment() != null) {\r
@@ -194,6 +347,10 @@ public class ResourcesView extends TmfView {
             }\r
         };\r
         thread.start();\r
+        \r
+        // View Action Handling\r
+        makeActions();\r
+        contributeToActionBars();\r
     }\r
 \r
     /* (non-Javadoc)\r
@@ -214,7 +371,7 @@ public class ResourcesView extends TmfView {
             return;\r
         }\r
 \r
-        final Thread thread = new Thread() {\r
+        final Thread thread = new Thread("ResourcesView build") { //$NON-NLS-1$\r
             @Override\r
             public void run() {\r
                 selectExperiment(signal.getExperiment());\r
@@ -222,51 +379,183 @@ public class ResourcesView extends TmfView {
         thread.start();\r
     }\r
 \r
+    @TmfSignalHandler\r
+    public void synchToTime(final TmfTimeSynchSignal signal) {\r
+        if (signal.getSource() == this) {\r
+            return;\r
+        }\r
+        final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
+        Display.getDefault().asyncExec(new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                if (fTimeGraphViewer.getControl().isDisposed()) {\r
+                    return;\r
+                }\r
+                fTimeGraphViewer.setSelectedTime(time, true, signal.getSource());\r
+            }\r
+        });\r
+    }\r
+\r
+    @TmfSignalHandler\r
+    public void synchToRange(final TmfRangeSynchSignal signal) {\r
+        if (signal.getSource() == this) {\r
+            return;\r
+        }\r
+        final long startTime = signal.getCurrentRange().getStartTime().normalize(0, -9).getValue();\r
+        final long endTime = signal.getCurrentRange().getEndTime().normalize(0, -9).getValue();\r
+        final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
+        Display.getDefault().asyncExec(new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                if (fTimeGraphViewer.getControl().isDisposed()) {\r
+                    return;\r
+                }\r
+                fTimeGraphViewer.setStartFinishTime(startTime, endTime);\r
+                fTimeGraphViewer.setSelectedTime(time, false, signal.getSource());\r
+            }\r
+        });\r
+    }\r
+\r
+    // ------------------------------------------------------------------------\r
+    // Internal\r
+    // ------------------------------------------------------------------------\r
+\r
     @SuppressWarnings("unchecked")\r
     private void selectExperiment(TmfExperiment<?> experiment) {\r
         fStartTime = Long.MAX_VALUE;\r
         fEndTime = Long.MIN_VALUE;\r
         fSelectedExperiment = (TmfExperiment<ITmfEvent>) experiment;\r
-        fEntryList = new ArrayList<ITimeGraphEntry>();\r
+        fEntryList = new ArrayList<TraceEntry>();\r
         for (ITmfTrace<?> trace : experiment.getTraces()) {\r
-            GroupEntry groupEntry = new GroupEntry(null, trace.getPath());\r
-            fEntryList.add(groupEntry);\r
-            refresh();\r
             if (trace instanceof CtfKernelTrace) {\r
                 CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace;\r
+                TraceEntry groupEntry = new TraceEntry(ctfKernelTrace, trace.getName());\r
+                fEntryList.add(groupEntry);\r
                 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
-                long start = ssq.getStartTime();\r
-                long end = ssq.getCurrentEndTime();\r
-                fStartTime = Math.min(fStartTime, start);\r
-                fEndTime = Math.max(fEndTime, end);\r
+                long startTime = ssq.getStartTime();\r
+                long endTime = ssq.getCurrentEndTime() + 1;\r
+                fStartTime = Math.min(fStartTime, startTime);\r
+                fEndTime = Math.max(fEndTime, endTime);\r
                 List<Integer> cpuQuarks = ssq.getQuarks(Attributes.CPUS, "*"); //$NON-NLS-1$\r
-                for (int cpuQuark : cpuQuarks) {\r
-                    String cpuName = "CPU " + ssq.getAttributeName(cpuQuark);\r
-                    ResourcesEntry entry = new ResourcesEntry(groupEntry, ctfKernelTrace, cpuName);\r
-                    try {\r
-                        int currentThreadQuark = ssq.getQuarkRelative(cpuQuark, Attributes.CURRENT_THREAD);\r
-                        long resolution = (end - start) / fDisplayWidth;\r
-                        List<ITmfStateInterval> currentThreadIntervals = ssq.queryHistoryRange(currentThreadQuark, start, end, resolution);\r
-                        for (ITmfStateInterval currentThreadInterval : currentThreadIntervals) {\r
-                            if (!currentThreadInterval.getStateValue().isNull() && currentThreadInterval.getStateValue().getType() == 0) {\r
-                                int currentThread = currentThreadInterval.getStateValue().unboxInt();\r
-                                long startTime = currentThreadInterval.getStartTime();\r
-                                long endTime = currentThreadInterval.getEndTime();\r
-                                entry.addTraceEvent(new TimeEvent(entry, startTime, endTime - startTime));\r
-                            }\r
+                ResourcesEntry[] cpuEntries = new ResourcesEntry[cpuQuarks.size()];\r
+                for (int i = 0; i < cpuQuarks.size(); i++) {\r
+                    int cpuQuark = cpuQuarks.get(i);\r
+                    int cpu = Integer.parseInt(ssq.getAttributeName(cpuQuark));\r
+                    ResourcesEntry entry = new ResourcesEntry(cpuQuark, ctfKernelTrace, Type.CPU, cpu);\r
+                    groupEntry.addChild(entry);\r
+                    cpuEntries[i] = entry;\r
+                }\r
+                List<Integer> irqQuarks = ssq.getQuarks(Attributes.RESOURCES, Attributes.IRQS, "*"); //$NON-NLS-1$\r
+                ResourcesEntry[] irqEntries = new ResourcesEntry[irqQuarks.size()];\r
+                for (int i = 0; i < irqQuarks.size(); i++) {\r
+                    int irqQuark = irqQuarks.get(i);\r
+                    int irq = Integer.parseInt(ssq.getAttributeName(irqQuark));\r
+                    ResourcesEntry entry = new ResourcesEntry(irqQuark, ctfKernelTrace, Type.IRQ, irq);\r
+                    groupEntry.addChild(entry);\r
+                    irqEntries[i] = entry;\r
+                }\r
+                List<Integer> softIrqQuarks = ssq.getQuarks(Attributes.RESOURCES, Attributes.SOFT_IRQS, "*"); //$NON-NLS-1$\r
+                ResourcesEntry[] softIrqEntries = new ResourcesEntry[softIrqQuarks.size()];\r
+                for (int i = 0; i < softIrqQuarks.size(); i++) {\r
+                    int softIrqQuark = softIrqQuarks.get(i);\r
+                    int softIrq = Integer.parseInt(ssq.getAttributeName(softIrqQuark));\r
+                    ResourcesEntry entry = new ResourcesEntry(softIrqQuark, ctfKernelTrace, Type.SOFT_IRQ, softIrq);\r
+                    groupEntry.addChild(entry);\r
+                    softIrqEntries[i] = entry;\r
+                }\r
+            }\r
+        }\r
+        refresh();\r
+        for (TraceEntry traceEntry : fEntryList) {\r
+            CtfKernelTrace ctfKernelTrace = ((TraceEntry) traceEntry).getTrace();\r
+            IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
+            long startTime = ssq.getStartTime();\r
+            long endTime = ssq.getCurrentEndTime() + 1;\r
+            long resolution = (endTime - startTime) / fDisplayWidth;\r
+            for (ResourcesEntry entry : traceEntry.getChildren()) {\r
+                List<ITimeEvent> eventList = getEventList(entry, startTime, endTime, resolution, false);\r
+                entry.setEventList(eventList);\r
+                redraw();\r
+            }\r
+        }\r
+    }\r
+\r
+    private List<ITimeEvent> getEventList(ResourcesEntry entry, long startTime, long endTime, long resolution, boolean includeNull) {\r
+        IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
+        List<ITimeEvent> eventList = null;\r
+        int quark = entry.getQuark();\r
+        try {\r
+            if (entry.getType().equals(Type.CPU)) {\r
+                int currentThreadQuark = ssq.getQuarkRelative(quark, Attributes.CURRENT_THREAD);\r
+                List<ITmfStateInterval> currentThreadIntervals = ssq.queryHistoryRange(currentThreadQuark, startTime, endTime - 1, resolution);\r
+                eventList = new ArrayList<ITimeEvent>(currentThreadIntervals.size());\r
+                long lastEndTime = -1;\r
+                for (ITmfStateInterval currentThreadInterval : currentThreadIntervals) {\r
+                    if (!currentThreadInterval.getStateValue().isNull()) {\r
+                        int currentThread = currentThreadInterval.getStateValue().unboxInt();\r
+                        long time = currentThreadInterval.getStartTime();\r
+                        long duration = currentThreadInterval.getEndTime() - time + 1;\r
+                        if (lastEndTime != time && lastEndTime != -1) {\r
+                            eventList.add(new TimeEvent(entry, lastEndTime, time - lastEndTime));\r
                         }\r
-                    } catch (AttributeNotFoundException e) {\r
-                        e.printStackTrace();\r
-                    } catch (TimeRangeException e) {\r
-                        e.printStackTrace();\r
-                    } catch (StateValueTypeException e) {\r
-                        e.printStackTrace();\r
+                        eventList.add(new ResourcesEvent(entry, time, duration, currentThread));\r
+                        lastEndTime = time + duration;\r
                     }\r
-                    groupEntry.addChild(entry);\r
-                    refresh();\r
+                }\r
+            } else if (entry.getType().equals(Type.IRQ)) {\r
+                List<ITmfStateInterval> irqIntervals = ssq.queryHistoryRange(quark, startTime, endTime - 1, resolution);\r
+                eventList = new ArrayList<ITimeEvent>(irqIntervals.size());\r
+                long lastEndTime = -1;\r
+                boolean lastIsNull = true;\r
+                for (ITmfStateInterval irqInterval : irqIntervals) {\r
+                    long time = irqInterval.getStartTime();\r
+                    long duration = irqInterval.getEndTime() - time + 1;\r
+                    if (!irqInterval.getStateValue().isNull()) {\r
+                        int cpu = irqInterval.getStateValue().unboxInt();\r
+                        eventList.add(new ResourcesEvent(entry, time, duration, cpu));\r
+                        lastIsNull = false;\r
+                    } else {\r
+                        if (lastEndTime != time && lastEndTime != -1 && lastIsNull) {\r
+                            eventList.add(new ResourcesEvent(entry, lastEndTime, time - lastEndTime, -1));\r
+                        }\r
+                        if (includeNull) {\r
+                            eventList.add(new ResourcesEvent(entry, time, duration));\r
+                        }\r
+                        lastIsNull = true;\r
+                    }\r
+                    lastEndTime = time + duration;\r
+                }\r
+            } else if (entry.getType().equals(Type.SOFT_IRQ)) {\r
+                List<ITmfStateInterval> softIrqIntervals = ssq.queryHistoryRange(quark, startTime, endTime - 1, resolution);\r
+                eventList = new ArrayList<ITimeEvent>(softIrqIntervals.size());\r
+                long lastEndTime = -1;\r
+                boolean lastIsNull = true;\r
+                for (ITmfStateInterval softIrqInterval : softIrqIntervals) {\r
+                    long time = softIrqInterval.getStartTime();\r
+                    long duration = softIrqInterval.getEndTime() - time + 1;\r
+                    if (!softIrqInterval.getStateValue().isNull()) {\r
+                        int cpu = softIrqInterval.getStateValue().unboxInt();\r
+                        eventList.add(new ResourcesEvent(entry, time, duration, cpu));\r
+                    } else {\r
+                        if (lastEndTime != time && lastEndTime != -1 && lastIsNull) {\r
+                            eventList.add(new ResourcesEvent(entry, lastEndTime, time - lastEndTime, -1));\r
+                        }\r
+                        if (includeNull) {\r
+                            eventList.add(new ResourcesEvent(entry, time, duration));\r
+                        }\r
+                        lastIsNull = true;\r
+                    }\r
+                    lastEndTime = time + duration;\r
                 }\r
             }\r
+        } catch (AttributeNotFoundException e) {\r
+            e.printStackTrace();\r
+        } catch (TimeRangeException e) {\r
+            e.printStackTrace();\r
+        } catch (StateValueTypeException e) {\r
+            e.printStackTrace();\r
         }\r
+        return eventList;\r
     }\r
 \r
     private void refresh() {\r
@@ -276,11 +565,53 @@ public class ResourcesView extends TmfView {
                 if (fTimeGraphViewer.getControl().isDisposed()) {\r
                     return;\r
                 }\r
-                fTimeGraphViewer.setInput(fEntryList.toArray(new ITimeGraphEntry[0]));\r
+                ITimeGraphEntry[] entries = fEntryList.toArray(new ITimeGraphEntry[0]);\r
+                Arrays.sort(entries);\r
+                fTimeGraphViewer.setInput(entries);\r
                 fTimeGraphViewer.setTimeBounds(fStartTime, fEndTime);\r
                 fTimeGraphViewer.setStartFinishTime(fStartTime, fEndTime);\r
             }\r
         });\r
     }\r
 \r
+\r
+    private void redraw() {\r
+        Display.getDefault().asyncExec(new Runnable() {\r
+            @Override\r
+            public void run() {\r
+                if (fTimeGraphViewer.getControl().isDisposed()) {\r
+                    return;\r
+                }\r
+                fTimeGraphViewer.getControl().redraw();\r
+                fTimeGraphViewer.getControl().update();\r
+            }\r
+        });\r
+    }\r
+\r
+    private void makeActions() {\r
+        fPreviousResourceAction = fTimeGraphViewer.getPreviousItemAction();\r
+        fPreviousResourceAction.setText(Messages.ResourcesView_previousResourceActionNameText);\r
+        fPreviousResourceAction.setToolTipText(Messages.ResourcesView_previousResourceActionToolTipText);\r
+        fNextResourceAction = fTimeGraphViewer.getNextItemAction();\r
+        fNextResourceAction.setText(Messages.ResourcesView_nextResourceActionNameText);\r
+        fNextResourceAction.setToolTipText(Messages.ResourcesView_previousResourceActionToolTipText);\r
+    }\r
+    \r
+    private void contributeToActionBars() {\r
+        IActionBars bars = getViewSite().getActionBars();\r
+        fillLocalToolBar(bars.getToolBarManager());\r
+    }\r
+    \r
+    private void fillLocalToolBar(IToolBarManager manager) {\r
+        manager.add(fTimeGraphViewer.getShowLegendAction());\r
+        manager.add(new Separator());\r
+        manager.add(fTimeGraphViewer.getResetScaleAction());\r
+        manager.add(fTimeGraphViewer.getPreviousEventAction());\r
+        manager.add(fTimeGraphViewer.getNextEventAction());\r
+        manager.add(fPreviousResourceAction);\r
+        manager.add(fNextResourceAction);\r
+        manager.add(fTimeGraphViewer.getZoomInAction());\r
+        manager.add(fTimeGraphViewer.getZoomOutAction());\r
+        manager.add(new Separator());\r
+    }\r
 }\r
index b9ad132c15143d099ff7bd88b87a8475dfe1dd14..23883cb86ffc919ec4359f998bb80db3f389d568 100644 (file)
@@ -71,9 +71,11 @@ public class ControlView extends ViewPart implements ITraceControlComponentChang
     // ------------------------------------------------------------------------
     // Accessors
     // ------------------------------------------------------------------------
-    
+
     /**
-     * @return returns the trace control tree node (model).
+     * Returns the trace control tree node (model)
+     * 
+     * @return the trace control tree node (model).
      */
     public ITraceControlComponent getTraceControlRoot() {
         return fRoot;
This page took 0.046997 seconds and 5 git commands to generate.