LTTng 2.0.
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
-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
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2012 Ericsson\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
+ * Contributors:\r
+ * Patrick Tasse - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.common;\r
+\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.NoSuchElementException;\r
+\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeEvent;\r
+\r
+public class EventIterator implements Iterator<ITimeEvent> {\r
+\r
+ private long fStartTime;\r
+ private long fEndTime;\r
+ private List<ITimeEvent> fEventList;\r
+ private List<ITimeEvent> fZoomedEventList;\r
+ private long fZoomedStartTime;\r
+ private long fZoomedEndTime;\r
+ private int fIndex = 0;\r
+ private int fZoomedIndex= 0;\r
+ private ITimeEvent fNext = null;\r
+ private ITimeEvent fZoomedNext = null;\r
+\r
+ public EventIterator(List<ITimeEvent> eventList, List<ITimeEvent> zoomedEventList) {\r
+ this(eventList, zoomedEventList, Long.MIN_VALUE, Long.MAX_VALUE);\r
+ }\r
+\r
+ public EventIterator(List<ITimeEvent> eventList, List<ITimeEvent> zoomedEventList, long startTime, long endTime) {\r
+ fEventList = eventList;\r
+ fZoomedEventList = zoomedEventList;\r
+ if (zoomedEventList != null && zoomedEventList.size() > 0) {\r
+ fZoomedStartTime = zoomedEventList.get(0).getTime();\r
+ ITimeEvent lastEvent = zoomedEventList.get(zoomedEventList.size() - 1);\r
+ fZoomedEndTime = lastEvent.getTime() + lastEvent.getDuration();\r
+ } else {\r
+ fZoomedStartTime = Long.MAX_VALUE;\r
+ fZoomedEndTime = Long.MIN_VALUE;\r
+ }\r
+ fStartTime = startTime;\r
+ fEndTime = endTime;\r
+ }\r
+\r
+ @Override\r
+ public boolean hasNext() {\r
+ if (fNext == null && fEventList != null) {\r
+ while (fIndex < fEventList.size()) {\r
+ ITimeEvent event = fEventList.get(fIndex++);\r
+ if (event.getTime() + event.getDuration() >= fStartTime && event.getTime() <= fEndTime) {\r
+ fNext = event;\r
+ break;\r
+ }\r
+ }\r
+ if (fNext == null) {\r
+ fEventList = null;\r
+ }\r
+ }\r
+\r
+ if (fZoomedNext == null && fZoomedEventList != null) {\r
+ while (fZoomedIndex < fZoomedEventList.size()) {\r
+ ITimeEvent event = fZoomedEventList.get(fZoomedIndex++);\r
+ if (event.getTime() + event.getDuration() >= fStartTime && event.getTime() <= fEndTime) {\r
+ fZoomedNext = event;\r
+ break;\r
+ }\r
+ }\r
+ if (fZoomedNext == null) {\r
+ fZoomedEventList = null;\r
+ }\r
+ }\r
+\r
+ return fNext != null || fZoomedNext != null;\r
+ }\r
+\r
+ @Override\r
+ public ITimeEvent next() {\r
+ if (hasNext()) {\r
+ if (fZoomedNext != null && (fNext == null || fZoomedNext.getTime() <= fNext.getTime())) {\r
+ if (fNext != null && fNext.getTime() == fZoomedNext.getTime()) {\r
+ long duration = fNext.getTime() + fNext.getDuration() - fZoomedEndTime;\r
+ if (duration > 0) {\r
+ fNext = new TimeEvent(fNext.getEntry(), fZoomedEndTime, duration);\r
+ } else {\r
+ fNext = null;\r
+ }\r
+ }\r
+ ITimeEvent event = fZoomedNext;\r
+ fZoomedNext = null;\r
+ return event;\r
+ }\r
+ if (fNext.getTime() < fZoomedEndTime && fNext.getTime() + fNext.getDuration() > fZoomedStartTime) {\r
+ ITimeEvent event = new TimeEvent(fNext.getEntry(), fNext.getTime(), fZoomedStartTime - fNext.getTime());\r
+ long duration = fNext.getTime() + fNext.getDuration() - fZoomedEndTime;\r
+ if (duration > 0) {\r
+ fNext = new TimeEvent(fNext.getEntry(), fZoomedEndTime, duration);\r
+ } else {\r
+ fNext = null;\r
+ }\r
+ return event;\r
+ }\r
+ ITimeEvent event = fNext;\r
+ fNext = null;\r
+ return event;\r
+ }\r
+ throw new NoSuchElementException();\r
+ }\r
+\r
+ @Override\r
+ public void remove() {\r
+ throw new UnsupportedOperationException();\r
+ }\r
+}\r
\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
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
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
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2012 Ericsson\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
+ * Contributors:\r
+ * Patrick Tasse - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.controlflow;\r
+\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeEvent;\r
+\r
+public class ControlFlowEvent extends TimeEvent {\r
+\r
+ private int fStatus;\r
+\r
+ public ControlFlowEvent(ITimeGraphEntry entry, long time, long duration, int status) {\r
+ super(entry, time, duration);\r
+ fStatus = status;\r
+ }\r
+\r
+ public int getStatus() {\r
+ return fStatus;\r
+ }\r
+}\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.jface.viewers.ILabelProviderListener;\r
import org.eclipse.jface.viewers.ITableLabelProvider;\r
import org.eclipse.jface.viewers.ITreeContentProvider;\r
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.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.core.trace.TmfExperiment;\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
*/\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
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
// 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
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
\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
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
@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
}\r
};\r
thread.start();\r
+ \r
+ // View Action Handling\r
+ makeActions();\r
+ contributeToActionBars();\r
}\r
\r
/* (non-Javadoc)\r
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
} 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
}\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
}\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
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
\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
}\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
--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2012 Ericsson\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
+ * Contributors:\r
+ * Patrick Tasse - Initial API and implementation\r
+ *******************************************************************************/\r
+\r
+package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources;\r
+\r
+import org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources.ResourcesEntry.Type;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeEvent;\r
+\r
+public class ResourcesEvent extends TimeEvent {\r
+\r
+ private Type fType;\r
+ private int fValue;\r
+\r
+ public ResourcesEvent(ResourcesEntry entry, long time, long duration, int value) {\r
+ super(entry, time, duration);\r
+ fType = entry.getType();\r
+ fValue = value;\r
+ }\r
+\r
+ public ResourcesEvent(ResourcesEntry entry, long time, long duration) {\r
+ super(entry, time, duration);\r
+ fType = Type.NULL;\r
+ }\r
+\r
+ public int getValue() {\r
+ return fValue;\r
+ }\r
+\r
+ public Type getType() {\r
+ return fType;\r
+ }\r
+}\r
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.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.core.trace.TmfExperiment;\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
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
\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
}\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
}\r
\r
@Override\r
- public long getStopTime() {\r
+ public long getEndTime() {\r
return -1;\r
}\r
\r
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
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
}\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
}\r
};\r
thread.start();\r
+ \r
+ // View Action Handling\r
+ makeActions();\r
+ contributeToActionBars();\r
}\r
\r
/* (non-Javadoc)\r
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
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
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
// ------------------------------------------------------------------------
// 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;