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_birthTimeColumn;\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_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_birthTimeColumn=Birth time\r
+ControlFlowView_birthNsecColumn=Birth nsec\r
+ControlFlowView_birthSecColumn=Birth sec\r
+ControlFlowView_brandColumn=Brand\r
+ControlFlowView_cpuColumn=CPU\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
\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 ControlFlowEntry fParent = null;\r
- private ArrayList<ControlFlowEntry> fChildren = new ArrayList<ControlFlowEntry>();\r
+ private ITimeGraphEntry parent = null;\r
+ private ITimeGraphEntry[] children = null;\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
- private List<ITimeEvent> fEventList = new ArrayList<ITimeEvent>();\r
- private List<ITimeEvent> fZoomedEventList = null;\r
+ List<ITimeEvent> list = new LinkedList<ITimeEvent>();\r
\r
- public ControlFlowEntry(int threadQuark, CtfKernelTrace trace, String execName, int threadId, int ppid, long birthTime, long startTime, long endTime) {\r
- fThreadQuark = threadQuark;\r
+ public ControlFlowEntry(CtfKernelTrace trace, String execName, int threadId, int ppid, long startTime, long endTime) {\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 fParent;\r
+ return parent;\r
}\r
\r
@Override\r
public boolean hasChildren() {\r
- return fChildren != null && fChildren.size() > 0;\r
+ return children != null && children.length > 0;\r
}\r
\r
@Override\r
- public ControlFlowEntry[] getChildren() {\r
- return fChildren.toArray(new ControlFlowEntry[0]);\r
+ public ITimeGraphEntry[] getChildren() {\r
+ return children;\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 getEndTime() {\r
+ public long getStopTime() {\r
return fEndTime;\r
}\r
\r
@Override\r
public Iterator<ITimeEvent> getTimeEventsIterator() {\r
- return new EventIterator(fEventList, fZoomedEventList);\r
+ return list.iterator();\r
}\r
\r
@Override\r
public Iterator<ITimeEvent> getTimeEventsIterator(long startTime, long stopTime, long visibleDuration) {\r
- return new EventIterator(fEventList, fZoomedEventList, startTime, stopTime);\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
}\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
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.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.TimeGraphPresentationProvider;\r
+import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphProvider;\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 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
+ 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
\r
private final String[] COLUMN_NAMES = new String[] {\r
PROCESS_COLUMN,\r
TID_COLUMN,\r
+ TGID_COLUMN,\r
PPID_COLUMN,\r
- BIRTH_TIME_COLUMN,\r
+ CPU_COLUMN,\r
+ BIRTH_SEC_COLUMN,\r
+ BIRTH_NSEC_COLUMN,\r
TRACE_COLUMN\r
};\r
\r
private TmfExperiment<ITmfEvent> fSelectedExperiment;\r
\r
// The timegraph entry list\r
- private ArrayList<ControlFlowEntry> fEntryList;\r
+ private ArrayList<ITimeGraphEntry> 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 == 2) {\r
- if (entry.getPPID() > 0) {\r
+ } else if (columnIndex == 3) {\r
+ if (entry.getPPID() != -1) {\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 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
+ fTimeGraphCombo.setTimeGraphProvider(new TimeGraphProvider() {\r
+ @Override\r
+ public String getTraceClassName(ITimeGraphEntry trace) {\r
+ return "trace class"; //$NON-NLS-1$\r
}\r
\r
@Override\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
+ public String getStateName(StateColor color) {\r
+ return "state name"; //$NON-NLS-1$\r
}\r
-\r
- @Override\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 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
+ public String getEventName(ITimeEvent event, boolean upper, boolean extInfo) {\r
+ return "event name"; //$NON-NLS-1$\r
}\r
\r
@Override\r
public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event) {\r
return new HashMap<String, String>();\r
}\r
+ \r
+ @Override\r
+ public StateColor getEventColor(ITimeEvent event) {\r
+ return StateColor.BLACK;\r
+ }\r
});\r
\r
fTimeGraphCombo.setTreeColumns(COLUMN_NAMES);\r
fTimeGraphCombo.getTimeGraphViewer().addRangeListener(new ITimeGraphRangeListener() {\r
@Override\r
public void timeRangeUpdated(TimeGraphRangeUpdateEvent event) {\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
+ long startTime = event.getStartTime();\r
+ long endTime = event.getEndTime();\r
+ System.out.println("timeRangeUpdated: startTime="+startTime+" endTime="+endTime);\r
}\r
});\r
\r
@Override\r
public void timeSelected(TimeGraphTimeEvent event) {\r
long time = event.getTime();\r
- broadcast(new TmfTimeSynchSignal(ControlFlowView.this, new CtfTmfTimestamp(time)));\r
+ System.out.println("timeSelected: time="+time);\r
}\r
});\r
\r
fTimeGraphCombo.addSelectionListener(new ITimeGraphSelectionListener() {\r
@Override\r
public void selectionChanged(TimeGraphSelectionEvent event) {\r
- //ITimeGraphEntry selection = event.getSelection();\r
+ ITimeGraphEntry selection = event.getSelection();\r
+ System.out.println("selectionChanged: source="+event.getSource()+" selection="+ (selection == null ? selection : selection.getName()));\r
}\r
});\r
\r
- fTimeGraphCombo.getTimeGraphViewer().setTimeCalendarFormat(true);\r
-\r
- final Thread thread = new Thread("ControlFlowView build") { //$NON-NLS-1$\r
+ final Thread thread = new Thread() {\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("ControlFlowView build") { //$NON-NLS-1$\r
+ final Thread thread = new Thread() {\r
@Override\r
public void run() {\r
selectExperiment(signal.getExperiment());\r
}};\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
+ thread.run();\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<ControlFlowEntry>();\r
+ HashMap<String, ITimeGraphEntry> traces = new HashMap<String, ITimeGraphEntry>();\r
+ fEntryList = new ArrayList<ITimeGraphEntry>();\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() + 1;\r
- if (birthTime == -1) {\r
- birthTime = startTime;\r
- }\r
+ long endTime = execNameInterval.getEndTime();\r
int ppid = -1;\r
if (ppidQuark != -1) {\r
ITmfStateInterval ppidInterval = ssq.querySingleState(startTime, ppidQuark);\r
ppid = ppidInterval.getStateValue().unboxInt();\r
}\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
+ 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
}\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
- private List<ITimeEvent> fEventList = new ArrayList<ITimeEvent>();\r
- private List<ITimeEvent> fZoomedEventList = null;\r
+ List<ITimeEvent> list = new LinkedList<ITimeEvent>();\r
\r
- public ResourcesEntry(int quark, CtfKernelTrace trace, Type type, int id) {\r
- fQuark = quark;\r
+ public ResourcesEntry(ITimeGraphEntry parent, CtfKernelTrace trace, String cpuName) {\r
+ fParent = parent;\r
fTrace = trace;\r
- fType = type;\r
- fId = id;\r
- fName = type.toString() + ' ' + Integer.toString(id);\r
+ fName = cpuName;\r
}\r
\r
@Override\r
}\r
\r
@Override\r
- public long getEndTime() {\r
+ public long getStopTime() {\r
return fEndTime;\r
}\r
\r
@Override\r
public Iterator<ITimeEvent> getTimeEventsIterator() {\r
- return new EventIterator(fEventList, fZoomedEventList);\r
+ return list.iterator();\r
}\r
\r
@Override\r
public Iterator<ITimeEvent> getTimeEventsIterator(long startTime, long stopTime, long visibleDuration) {\r
- return new EventIterator(fEventList, fZoomedEventList, startTime, stopTime);\r
- }\r
-\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
+ return getTimeEventsIterator();\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
+ 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
- }\r
-\r
- public void setZoomedEventList(List<ITimeEvent> eventList) {\r
- fZoomedEventList = eventList;\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.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.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.TimeGraphProvider;\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<TraceEntry> fEntryList;\r
+ private ArrayList<ITimeGraphEntry> 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 TraceEntry implements ITimeGraphEntry {\r
- private CtfKernelTrace fTrace;\r
- public ArrayList<ResourcesEntry> fChildren;\r
+ private class GroupEntry implements ITimeGraphEntry {\r
+ public ITimeGraphEntry fParent;\r
+ public ArrayList<ITimeGraphEntry> fChildren;\r
public String fName;\r
\r
- public TraceEntry(CtfKernelTrace trace, String name) {\r
- fTrace = trace;\r
- fChildren = new ArrayList<ResourcesEntry>();\r
+ public GroupEntry(ITimeGraphEntry parent, String name) {\r
+ fParent = parent;\r
+ fChildren = new ArrayList<ITimeGraphEntry>();\r
fName = name;\r
}\r
\r
@Override\r
public ITimeGraphEntry getParent() {\r
- return null;\r
+ return fParent;\r
}\r
\r
@Override\r
}\r
\r
@Override\r
- public ResourcesEntry[] getChildren() {\r
- return fChildren.toArray(new ResourcesEntry[0]);\r
+ public ITimeGraphEntry[] getChildren() {\r
+ return fChildren.toArray(new ITimeGraphEntry[0]);\r
}\r
\r
@Override\r
}\r
\r
@Override\r
- public long getEndTime() {\r
+ public long getStopTime() {\r
return -1;\r
}\r
\r
return null;\r
}\r
\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
+ public void addChild(ITimeGraphEntry entry) {\r
+ fChildren.add(entry);\r
}\r
}\r
\r
public void createPartControl(Composite parent) {\r
fTimeGraphViewer = new TimeGraphViewer(parent, SWT.NONE);\r
\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
+ fTimeGraphViewer.setTimeGraphProvider(new TimeGraphProvider() {\r
@Override\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
+ public String getTraceClassName(ITimeGraphEntry trace) {\r
+ return "trace class"; //$NON-NLS-1$\r
}\r
\r
@Override\r
- public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event) {\r
- return new HashMap<String, String>();\r
+ public String getStateName(StateColor color) {\r
+ return "state name"; //$NON-NLS-1$\r
}\r
\r
@Override\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
+ public String getEventName(ITimeEvent event, boolean upper, boolean extInfo) {\r
+ return "event name"; //$NON-NLS-1$\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
+ public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event) {\r
+ return new HashMap<String, String>();\r
}\r
- });\r
-\r
- fTimeGraphViewer.setTimeCalendarFormat(true);\r
-\r
- fTimeGraphViewer.addRangeListener(new ITimeGraphRangeListener() {\r
+ \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
+ public StateColor getEventColor(ITimeEvent event) {\r
+ if (event.getTime() % 2 == 0) {\r
+ return StateColor.BLACK;\r
+ } else {\r
+ return StateColor.GRAY;\r
}\r
- fZoomThread = new ZoomThread(startTime, endTime);\r
- fZoomThread.start();\r
}\r
});\r
\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
+ final Thread thread = new Thread() {\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("ResourcesView build") { //$NON-NLS-1$\r
+ final Thread thread = new Thread() {\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<TraceEntry>();\r
+ fEntryList = new ArrayList<ITimeGraphEntry>();\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 startTime = ssq.getStartTime();\r
- long endTime = ssq.getCurrentEndTime() + 1;\r
- fStartTime = Math.min(fStartTime, startTime);\r
- fEndTime = Math.max(fEndTime, endTime);\r
+ long start = ssq.getStartTime();\r
+ long end = ssq.getCurrentEndTime();\r
+ fStartTime = Math.min(fStartTime, start);\r
+ fEndTime = Math.max(fEndTime, end);\r
List<Integer> cpuQuarks = ssq.getQuarks(Attributes.CPUS, "*"); //$NON-NLS-1$\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
- eventList.add(new ResourcesEvent(entry, time, duration, currentThread));\r
- lastEndTime = time + duration;\r
- }\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
+ 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
}\r
- if (includeNull) {\r
- eventList.add(new ResourcesEvent(entry, time, duration));\r
- }\r
- lastIsNull = true;\r
+ } catch (AttributeNotFoundException e) {\r
+ e.printStackTrace();\r
+ } catch (TimeRangeException e) {\r
+ e.printStackTrace();\r
+ } catch (StateValueTypeException e) {\r
+ e.printStackTrace();\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
+ groupEntry.addChild(entry);\r
+ refresh();\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
- ITimeGraphEntry[] entries = fEntryList.toArray(new ITimeGraphEntry[0]);\r
- Arrays.sort(entries);\r
- fTimeGraphViewer.setInput(entries);\r
+ fTimeGraphViewer.setInput(fEntryList.toArray(new ITimeGraphEntry[0]));\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
// ------------------------------------------------------------------------
-
+
/**
- * Returns the trace control tree node (model)
- *
- * @return the trace control tree node (model).
+ * @return returns the trace control tree node (model).
*/
public ITraceControlComponent getTraceControlRoot() {
return fRoot;