/*******************************************************************************\r
* Copyright (c) 2012 Ericsson\r
- * \r
+ *\r
* All rights reserved. This program and the accompanying materials are\r
* made available under the terms of the Eclipse Public License v1.0 which\r
* accompanies this distribution, and is available at\r
* http://www.eclipse.org/legal/epl-v10.html\r
- * \r
+ *\r
* Contributors:\r
* Patrick Tasse - Initial API and implementation\r
*******************************************************************************/\r
import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal;\r
import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal;\r
import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;\r
+import org.eclipse.linuxtools.tmf.core.signal.TmfStateSystemBuildCompleted;\r
import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal;\r
import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier;\r
import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;\r
import org.eclipse.swt.widgets.Display;\r
import org.eclipse.ui.IActionBars;\r
\r
+/**\r
+ * Main implementation for the LTTng 2.0 kernel Resource view\r
+ *\r
+ * @author Patrick Tasse\r
+ */\r
public class ResourcesView extends TmfView {\r
\r
// ------------------------------------------------------------------------\r
// Constants\r
// ------------------------------------------------------------------------\r
\r
- /**\r
- * View ID.\r
- */\r
+ /** View ID. */\r
public static final String ID = "org.eclipse.linuxtools.lttng2.kernel.ui.views.resources"; //$NON-NLS-1$\r
\r
- /**\r
- * Initial time range\r
- */\r
+ /** Initial time range */\r
private static final long INITIAL_WINDOW_OFFSET = (1L * 100 * 1000 * 1000); // .1sec\r
\r
// ------------------------------------------------------------------------\r
// The time graph entry list\r
private ArrayList<TraceEntry> fEntryList;\r
\r
+ // The time graph entry list synchronization object\r
+ final private Object fEntryListSyncObj = new Object();\r
+\r
// The start time\r
private long fStartTime;\r
\r
private long fEndTime;\r
\r
// The display width\r
- private int fDisplayWidth;\r
+ private final int fDisplayWidth;\r
\r
// The next resource action\r
private Action fNextResourceAction;\r
\r
private class TraceEntry implements ITimeGraphEntry {\r
// The Trace\r
- private CtfKernelTrace fTrace;\r
+ private final CtfKernelTrace fTrace;\r
// The start time\r
- private long fTraceStartTime;\r
+ private final long fTraceStartTime;\r
// The end time\r
- private long fTraceEndTime; \r
+ private final long fTraceEndTime;\r
// The children of the entry\r
- private ArrayList<ResourcesEntry> fChildren;\r
+ private final ArrayList<ResourcesEntry> fChildren;\r
// The name of entry\r
- private String fName;\r
+ private final String fName;\r
\r
public TraceEntry(CtfKernelTrace trace, String name, long startTime, long endTime) {\r
fTrace = trace;\r
fChildren.add(index, entry);\r
}\r
}\r
- \r
+\r
private static class TraceEntryComparator implements Comparator<ITimeGraphEntry> {\r
@Override\r
public int compare(ITimeGraphEntry o1, ITimeGraphEntry o2) {\r
}\r
\r
private class ZoomThread extends Thread {\r
- private long fZoomStartTime;\r
- private long fZoomEndTime;\r
- private IProgressMonitor fMonitor;\r
+ private final long fZoomStartTime;\r
+ private final long fZoomEndTime;\r
+ private final IProgressMonitor fMonitor;\r
\r
public ZoomThread(long startTime, long endTime) {\r
super("ResourcesView zoom"); //$NON-NLS-1$\r
\r
@Override\r
public void run() {\r
- ArrayList<TraceEntry> entryList = fEntryList;\r
+ ArrayList<TraceEntry> entryList = null;\r
+ synchronized (fEntryListSyncObj) {\r
+ entryList = fEntryList;\r
+ }\r
if (entryList == null) {\r
return;\r
}\r
long resolution = Math.max(1, (fZoomEndTime - fZoomStartTime) / fDisplayWidth);\r
for (TraceEntry traceEntry : entryList) {\r
for (ITimeGraphEntry child : traceEntry.getChildren()) {\r
- ResourcesEntry entry = (ResourcesEntry) child;\r
if (fMonitor.isCanceled()) {\r
break;\r
}\r
- List<ITimeEvent> zoomedEventList = getEventList(entry, fZoomStartTime, fZoomEndTime, resolution, true, fMonitor);\r
- if (fMonitor.isCanceled()) {\r
- break;\r
+ ResourcesEntry entry = (ResourcesEntry) child;\r
+ if (fZoomStartTime <= fStartTime && fZoomEndTime >= fEndTime) {\r
+ entry.setZoomedEventList(null);\r
+ } else {\r
+ List<ITimeEvent> zoomedEventList = getEventList(entry, fZoomStartTime, fZoomEndTime, resolution, true, fMonitor);\r
+ if (zoomedEventList != null) {\r
+ entry.setZoomedEventList(zoomedEventList);\r
+ }\r
}\r
- entry.setZoomedEventList(zoomedEventList);\r
- redraw();\r
}\r
}\r
+ redraw();\r
}\r
\r
public void cancel() {\r
// Constructors\r
// ------------------------------------------------------------------------\r
\r
+ /**\r
+ * Default constructor\r
+ */\r
public ResourcesView() {\r
super(ID);\r
fDisplayWidth = Display.getDefault().getBounds().width;\r
// Signal handlers\r
// ------------------------------------------------------------------------\r
\r
+ /**\r
+ * Handler for the ExperimentSelected signal\r
+ *\r
+ * @param signal\r
+ * The incoming signal\r
+ */\r
@TmfSignalHandler\r
public void experimentSelected(final TmfExperimentSelectedSignal<? extends TmfEvent> signal) {\r
if (signal.getExperiment().equals(fSelectedExperiment)) {\r
thread.start();\r
}\r
\r
+ /**\r
+ * Handler for the TimeSynch signal\r
+ *\r
+ * @param signal\r
+ * The incoming signal\r
+ */\r
@TmfSignalHandler\r
public void synchToTime(final TmfTimeSynchSignal signal) {\r
- if (signal.getSource() == this) {\r
+ if (signal.getSource() == this || fSelectedExperiment == null) {\r
return;\r
}\r
final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
return;\r
}\r
fTimeGraphViewer.setSelectedTime(time, true);\r
+ startZoomThread(fTimeGraphViewer.getTime0(), fTimeGraphViewer.getTime1());\r
}\r
});\r
}\r
\r
+ /**\r
+ * Handler for the RangeSynch signal\r
+ *\r
+ * @param signal\r
+ * The incoming signal\r
+ */\r
@TmfSignalHandler\r
public void synchToRange(final TmfRangeSynchSignal signal) {\r
- if (signal.getSource() == this) {\r
+ if (signal.getSource() == this || fSelectedExperiment == null) {\r
return;\r
}\r
final long startTime = signal.getCurrentRange().getStartTime().normalize(0, -9).getValue();\r
});\r
}\r
\r
+ /**\r
+ * Handler for the StatesystemBuildCompleted signal\r
+ *\r
+ * @param signal\r
+ * The incoming signal\r
+ */\r
+ @TmfSignalHandler\r
+ public void stateSystemBuildCompleted (final TmfStateSystemBuildCompleted signal) {\r
+ final TmfExperiment<?> selectedExperiment = fSelectedExperiment;\r
+ if (selectedExperiment == null) {\r
+ return;\r
+ }\r
+ for (ITmfTrace<?> trace : selectedExperiment.getTraces()) {\r
+ if (trace == signal.getTrace() && trace instanceof CtfKernelTrace) {\r
+ final Thread thread = new Thread("ResourcesView build") { //$NON-NLS-1$\r
+ @Override\r
+ public void run() {\r
+ // rebuild the model\r
+ selectExperiment(selectedExperiment);\r
+ }\r
+ };\r
+ thread.start();\r
+ }\r
+ }\r
+ }\r
+\r
// ------------------------------------------------------------------------\r
// Internal\r
// ------------------------------------------------------------------------\r
}\r
}\r
}\r
- fEntryList = entryList;\r
+ synchronized (fEntryListSyncObj) {\r
+ fEntryList = (ArrayList<TraceEntry>) entryList.clone();\r
+ }\r
refresh(INITIAL_WINDOW_OFFSET);\r
- for (TraceEntry traceEntry : fEntryList) {\r
+ for (TraceEntry traceEntry : entryList) {\r
CtfKernelTrace ctfKernelTrace = ((TraceEntry) traceEntry).getTrace();\r
IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
long startTime = ssq.getStartTime();\r
}\r
\r
private List<ITimeEvent> getEventList(ResourcesEntry entry, long startTime, long endTime, long resolution, boolean includeNull, IProgressMonitor monitor) {\r
+ IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
+ startTime = Math.max(startTime, ssq.getStartTime());\r
+ endTime = Math.min(endTime, ssq.getCurrentEndTime() + 1);\r
if (endTime <= startTime) {\r
return null;\r
}\r
- IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
List<ITimeEvent> eventList = null;\r
int quark = entry.getQuark();\r
try {\r
if (fTimeGraphViewer.getControl().isDisposed()) {\r
return;\r
}\r
- ITimeGraphEntry[] entries = fEntryList.toArray(new ITimeGraphEntry[0]);\r
+ ITimeGraphEntry[] entries = null;\r
+ synchronized (fEntryListSyncObj) {\r
+ entries = fEntryList.toArray(new ITimeGraphEntry[0]);\r
+ }\r
Arrays.sort(entries, new TraceEntryComparator());\r
fTimeGraphViewer.setInput(entries);\r
fTimeGraphViewer.setTimeBounds(fStartTime, fEndTime);\r