lttng: Javadoc udpate for the lttng2.kernel.ui package
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng2.kernel.ui / src / org / eclipse / linuxtools / internal / lttng2 / kernel / ui / views / resources / ResourcesView.java
CommitLineData
04835162
PT
1/*******************************************************************************\r
2 * Copyright (c) 2012 Ericsson\r
27f3a03d 3 *\r
04835162
PT
4 * All rights reserved. This program and the accompanying materials are\r
5 * made available under the terms of the Eclipse Public License v1.0 which\r
6 * accompanies this distribution, and is available at\r
7 * http://www.eclipse.org/legal/epl-v10.html\r
27f3a03d 8 *\r
04835162
PT
9 * Contributors:\r
10 * Patrick Tasse - Initial API and implementation\r
11 *******************************************************************************/\r
12\r
13package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources;\r
14\r
15import java.util.ArrayList;\r
49ffadb7 16import java.util.Arrays;\r
2c33fc31 17import java.util.Comparator;\r
04835162
PT
18import java.util.Iterator;\r
19import java.util.List;\r
04835162 20\r
0137b624
PT
21import org.eclipse.core.runtime.IProgressMonitor;\r
22import org.eclipse.core.runtime.NullProgressMonitor;\r
49ffadb7
PT
23import org.eclipse.jface.action.Action;\r
24import org.eclipse.jface.action.IToolBarManager;\r
25import org.eclipse.jface.action.Separator;\r
3e97fbfa 26import org.eclipse.linuxtools.internal.lttng2.kernel.core.Attributes;\r
49ffadb7
PT
27import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Messages;\r
28import org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources.ResourcesEntry.Type;\r
04835162 29import org.eclipse.linuxtools.lttng2.kernel.core.trace.CtfKernelTrace;\r
49ffadb7 30import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfTimestamp;\r
04835162
PT
31import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;\r
32import org.eclipse.linuxtools.tmf.core.event.TmfEvent;\r
49ffadb7
PT
33import org.eclipse.linuxtools.tmf.core.event.TmfTimeRange;\r
34import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;\r
04835162
PT
35import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException;\r
36import org.eclipse.linuxtools.tmf.core.exceptions.StateValueTypeException;\r
37import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException;\r
04835162
PT
38import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval;\r
39import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal;\r
49ffadb7 40import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal;\r
04835162 41import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;\r
b987050f 42import org.eclipse.linuxtools.tmf.core.signal.TmfStateSystemBuildCompleted;\r
49ffadb7 43import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal;\r
04835162
PT
44import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier;\r
45import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;\r
9e0640dc 46import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;\r
04835162 47import org.eclipse.linuxtools.tmf.ui.views.TmfView;\r
49ffadb7
PT
48import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphRangeListener;\r
49import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphTimeListener;\r
49ffadb7
PT
50import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphRangeUpdateEvent;\r
51import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphTimeEvent;\r
04835162
PT
52import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphViewer;\r
53import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
54import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
55import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeEvent;\r
56import org.eclipse.swt.SWT;\r
57import org.eclipse.swt.widgets.Composite;\r
58import org.eclipse.swt.widgets.Display;\r
49ffadb7 59import org.eclipse.ui.IActionBars;\r
04835162 60\r
27f3a03d
AM
61/**\r
62 * Main implementation for the LTTng 2.0 kernel Resource view\r
63 *\r
64 * @author Patrick Tasse\r
65 */\r
04835162
PT
66public class ResourcesView extends TmfView {\r
67\r
68 // ------------------------------------------------------------------------\r
69 // Constants\r
70 // ------------------------------------------------------------------------\r
71\r
27f3a03d 72 /** View ID. */\r
04835162
PT
73 public static final String ID = "org.eclipse.linuxtools.lttng2.kernel.ui.views.resources"; //$NON-NLS-1$\r
74\r
27f3a03d 75 /** Initial time range */\r
3ac6ad1a 76 private static final long INITIAL_WINDOW_OFFSET = (1L * 100 * 1000 * 1000); // .1sec\r
0137b624 77\r
04835162
PT
78 // ------------------------------------------------------------------------\r
79 // Fields\r
80 // ------------------------------------------------------------------------\r
81\r
82 // The time graph viewer\r
83 TimeGraphViewer fTimeGraphViewer;\r
84\r
85 // The selected experiment\r
86 private TmfExperiment<ITmfEvent> fSelectedExperiment;\r
87\r
88 // The time graph entry list\r
49ffadb7 89 private ArrayList<TraceEntry> fEntryList;\r
04835162 90\r
c19a8781
PT
91 // The time graph entry list synchronization object\r
92 final private Object fEntryListSyncObj = new Object();\r
93\r
04835162
PT
94 // The start time\r
95 private long fStartTime;\r
96\r
97 // The end time\r
98 private long fEndTime;\r
99\r
100 // The display width\r
27f3a03d 101 private final int fDisplayWidth;\r
0137b624 102\r
49ffadb7
PT
103 // The next resource action\r
104 private Action fNextResourceAction;\r
0137b624 105\r
49ffadb7
PT
106 // The previous resource action\r
107 private Action fPreviousResourceAction;\r
108\r
49ffadb7
PT
109 // The zoom thread\r
110 private ZoomThread fZoomThread;\r
04835162
PT
111\r
112 // ------------------------------------------------------------------------\r
113 // Classes\r
114 // ------------------------------------------------------------------------\r
115\r
49ffadb7 116 private class TraceEntry implements ITimeGraphEntry {\r
2c33fc31 117 // The Trace\r
27f3a03d 118 private final CtfKernelTrace fTrace;\r
2c33fc31 119 // The start time\r
27f3a03d 120 private final long fTraceStartTime;\r
2c33fc31 121 // The end time\r
27f3a03d 122 private final long fTraceEndTime;\r
2c33fc31 123 // The children of the entry\r
27f3a03d 124 private final ArrayList<ResourcesEntry> fChildren;\r
2c33fc31 125 // The name of entry\r
27f3a03d 126 private final String fName;\r
2c33fc31
BH
127\r
128 public TraceEntry(CtfKernelTrace trace, String name, long startTime, long endTime) {\r
49ffadb7
PT
129 fTrace = trace;\r
130 fChildren = new ArrayList<ResourcesEntry>();\r
04835162 131 fName = name;\r
2c33fc31
BH
132 fTraceStartTime = startTime;\r
133 fTraceEndTime = endTime;\r
04835162
PT
134 }\r
135\r
136 @Override\r
137 public ITimeGraphEntry getParent() {\r
49ffadb7 138 return null;\r
04835162
PT
139 }\r
140\r
141 @Override\r
142 public boolean hasChildren() {\r
143 return fChildren != null && fChildren.size() > 0;\r
144 }\r
145\r
146 @Override\r
49ffadb7
PT
147 public ResourcesEntry[] getChildren() {\r
148 return fChildren.toArray(new ResourcesEntry[0]);\r
04835162
PT
149 }\r
150\r
151 @Override\r
152 public String getName() {\r
153 return fName;\r
154 }\r
155\r
156 @Override\r
157 public long getStartTime() {\r
2c33fc31 158 return fTraceStartTime;\r
04835162
PT
159 }\r
160\r
161 @Override\r
49ffadb7 162 public long getEndTime() {\r
2c33fc31 163 return fTraceEndTime;\r
04835162
PT
164 }\r
165\r
8d8cb868
PT
166 @Override\r
167 public boolean hasTimeEvents() {\r
168 return false;\r
169 }\r
170\r
04835162
PT
171 @Override\r
172 public Iterator<ITimeEvent> getTimeEventsIterator() {\r
173 return null;\r
174 }\r
175\r
176 @Override\r
177 public <T extends ITimeEvent> Iterator<T> getTimeEventsIterator(long startTime, long stopTime, long visibleDuration) {\r
178 return null;\r
179 }\r
180\r
49ffadb7
PT
181 public CtfKernelTrace getTrace() {\r
182 return fTrace;\r
183 }\r
184\r
185 public void addChild(ResourcesEntry entry) {\r
186 int index;\r
187 for (index = 0; index < fChildren.size(); index++) {\r
188 ResourcesEntry other = fChildren.get(index);\r
189 if (entry.getType().compareTo(other.getType()) < 0) {\r
190 break;\r
191 } else if (entry.getType().equals(other.getType())) {\r
192 if (entry.getId() < other.getId()) {\r
193 break;\r
194 }\r
195 }\r
196 }\r
197 entry.setParent(this);\r
198 fChildren.add(index, entry);\r
199 }\r
200 }\r
27f3a03d 201\r
2c33fc31
BH
202 private static class TraceEntryComparator implements Comparator<ITimeGraphEntry> {\r
203 @Override\r
204 public int compare(ITimeGraphEntry o1, ITimeGraphEntry o2) {\r
205 int result = o1.getStartTime() < o2.getStartTime() ? -1 : o1.getStartTime() > o2.getStartTime() ? 1 : 0;\r
206 if (result == 0) {\r
207 result = o1.getName().compareTo(o2.getName());\r
208 }\r
209 return result;\r
210 }\r
211 }\r
49ffadb7
PT
212\r
213 private class ZoomThread extends Thread {\r
27f3a03d
AM
214 private final long fZoomStartTime;\r
215 private final long fZoomEndTime;\r
216 private final IProgressMonitor fMonitor;\r
49ffadb7
PT
217\r
218 public ZoomThread(long startTime, long endTime) {\r
219 super("ResourcesView zoom"); //$NON-NLS-1$\r
3ac6ad1a
BH
220 fZoomStartTime = startTime;\r
221 fZoomEndTime = endTime;\r
0137b624 222 fMonitor = new NullProgressMonitor();\r
49ffadb7
PT
223 }\r
224\r
225 @Override\r
226 public void run() {\r
c19a8781
PT
227 ArrayList<TraceEntry> entryList = null;\r
228 synchronized (fEntryListSyncObj) {\r
229 entryList = fEntryList;\r
230 }\r
8d8cb868 231 if (entryList == null) {\r
49ffadb7
PT
232 return;\r
233 }\r
3ac6ad1a 234 long resolution = Math.max(1, (fZoomEndTime - fZoomStartTime) / fDisplayWidth);\r
8d8cb868 235 for (TraceEntry traceEntry : entryList) {\r
49ffadb7 236 for (ITimeGraphEntry child : traceEntry.getChildren()) {\r
0137b624
PT
237 if (fMonitor.isCanceled()) {\r
238 break;\r
239 }\r
5929fada
PT
240 ResourcesEntry entry = (ResourcesEntry) child;\r
241 if (fZoomStartTime <= fStartTime && fZoomEndTime >= fEndTime) {\r
242 entry.setZoomedEventList(null);\r
243 } else {\r
244 List<ITimeEvent> zoomedEventList = getEventList(entry, fZoomStartTime, fZoomEndTime, resolution, true, fMonitor);\r
27f3a03d 245 if (zoomedEventList != null) {\r
5929fada
PT
246 entry.setZoomedEventList(zoomedEventList);\r
247 }\r
49ffadb7 248 }\r
49ffadb7
PT
249 }\r
250 }\r
f7ddf9b3 251 redraw();\r
49ffadb7
PT
252 }\r
253\r
254 public void cancel() {\r
0137b624 255 fMonitor.setCanceled(true);\r
04835162
PT
256 }\r
257 }\r
258\r
259 // ------------------------------------------------------------------------\r
260 // Constructors\r
261 // ------------------------------------------------------------------------\r
262\r
27f3a03d
AM
263 /**\r
264 * Default constructor\r
265 */\r
04835162
PT
266 public ResourcesView() {\r
267 super(ID);\r
268 fDisplayWidth = Display.getDefault().getBounds().width;\r
269 }\r
270\r
271 // ------------------------------------------------------------------------\r
272 // ViewPart\r
273 // ------------------------------------------------------------------------\r
274\r
275 /* (non-Javadoc)\r
276 * @see org.eclipse.linuxtools.tmf.ui.views.TmfView#createPartControl(org.eclipse.swt.widgets.Composite)\r
277 */\r
278 @Override\r
279 public void createPartControl(Composite parent) {\r
280 fTimeGraphViewer = new TimeGraphViewer(parent, SWT.NONE);\r
281\r
72b5abb1 282 fTimeGraphViewer.setTimeGraphProvider(new ResourcesPresentationProvider());\r
49ffadb7
PT
283\r
284 fTimeGraphViewer.setTimeCalendarFormat(true);\r
285\r
286 fTimeGraphViewer.addRangeListener(new ITimeGraphRangeListener() {\r
287 @Override\r
288 public void timeRangeUpdated(TimeGraphRangeUpdateEvent event) {\r
289 long startTime = event.getStartTime();\r
290 long endTime = event.getEndTime();\r
291 TmfTimeRange range = new TmfTimeRange(new CtfTmfTimestamp(startTime), new CtfTmfTimestamp(endTime));\r
292 TmfTimestamp time = new CtfTmfTimestamp(fTimeGraphViewer.getSelectedTime());\r
293 broadcast(new TmfRangeSynchSignal(ResourcesView.this, range, time));\r
3ac6ad1a 294 startZoomThread(startTime, endTime);\r
04835162
PT
295 }\r
296 });\r
297\r
49ffadb7
PT
298 fTimeGraphViewer.addTimeListener(new ITimeGraphTimeListener() {\r
299 @Override\r
300 public void timeSelected(TimeGraphTimeEvent event) {\r
301 long time = event.getTime();\r
302 broadcast(new TmfTimeSynchSignal(ResourcesView.this, new CtfTmfTimestamp(time)));\r
303 }\r
304 });\r
305\r
306 final Thread thread = new Thread("ResourcesView build") { //$NON-NLS-1$\r
04835162
PT
307 @Override\r
308 public void run() {\r
309 if (TmfExperiment.getCurrentExperiment() != null) {\r
310 selectExperiment(TmfExperiment.getCurrentExperiment());\r
311 }\r
312 }\r
313 };\r
314 thread.start();\r
0137b624 315\r
49ffadb7
PT
316 // View Action Handling\r
317 makeActions();\r
318 contributeToActionBars();\r
04835162
PT
319 }\r
320\r
321 /* (non-Javadoc)\r
322 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()\r
323 */\r
324 @Override\r
325 public void setFocus() {\r
326 fTimeGraphViewer.setFocus();\r
327 }\r
328\r
329 // ------------------------------------------------------------------------\r
330 // Signal handlers\r
331 // ------------------------------------------------------------------------\r
332\r
27f3a03d
AM
333 /**\r
334 * Handler for the ExperimentSelected signal\r
335 *\r
336 * @param signal\r
337 * The incoming signal\r
338 */\r
04835162
PT
339 @TmfSignalHandler\r
340 public void experimentSelected(final TmfExperimentSelectedSignal<? extends TmfEvent> signal) {\r
341 if (signal.getExperiment().equals(fSelectedExperiment)) {\r
342 return;\r
343 }\r
344\r
49ffadb7 345 final Thread thread = new Thread("ResourcesView build") { //$NON-NLS-1$\r
04835162
PT
346 @Override\r
347 public void run() {\r
348 selectExperiment(signal.getExperiment());\r
0137b624
PT
349 }\r
350 };\r
04835162
PT
351 thread.start();\r
352 }\r
353\r
27f3a03d
AM
354 /**\r
355 * Handler for the TimeSynch signal\r
356 *\r
357 * @param signal\r
358 * The incoming signal\r
359 */\r
49ffadb7
PT
360 @TmfSignalHandler\r
361 public void synchToTime(final TmfTimeSynchSignal signal) {\r
8a74a597 362 if (signal.getSource() == this || fSelectedExperiment == null) {\r
49ffadb7
PT
363 return;\r
364 }\r
365 final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
366 Display.getDefault().asyncExec(new Runnable() {\r
367 @Override\r
368 public void run() {\r
369 if (fTimeGraphViewer.getControl().isDisposed()) {\r
370 return;\r
371 }\r
3ac6ad1a 372 fTimeGraphViewer.setSelectedTime(time, true);\r
7264b6f2 373 startZoomThread(fTimeGraphViewer.getTime0(), fTimeGraphViewer.getTime1());\r
49ffadb7
PT
374 }\r
375 });\r
376 }\r
377\r
27f3a03d
AM
378 /**\r
379 * Handler for the RangeSynch signal\r
380 *\r
381 * @param signal\r
382 * The incoming signal\r
383 */\r
49ffadb7
PT
384 @TmfSignalHandler\r
385 public void synchToRange(final TmfRangeSynchSignal signal) {\r
8a74a597 386 if (signal.getSource() == this || fSelectedExperiment == null) {\r
49ffadb7
PT
387 return;\r
388 }\r
389 final long startTime = signal.getCurrentRange().getStartTime().normalize(0, -9).getValue();\r
390 final long endTime = signal.getCurrentRange().getEndTime().normalize(0, -9).getValue();\r
391 final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
392 Display.getDefault().asyncExec(new Runnable() {\r
393 @Override\r
394 public void run() {\r
395 if (fTimeGraphViewer.getControl().isDisposed()) {\r
396 return;\r
397 }\r
398 fTimeGraphViewer.setStartFinishTime(startTime, endTime);\r
8d8cb868 399 fTimeGraphViewer.setSelectedTime(time, false);\r
3ac6ad1a 400 startZoomThread(startTime, endTime);\r
49ffadb7
PT
401 }\r
402 });\r
403 }\r
404\r
27f3a03d
AM
405 /**\r
406 * Handler for the StatesystemBuildCompleted signal\r
407 *\r
408 * @param signal\r
409 * The incoming signal\r
410 */\r
b987050f
PT
411 @TmfSignalHandler\r
412 public void stateSystemBuildCompleted (final TmfStateSystemBuildCompleted signal) {\r
413 final TmfExperiment<?> selectedExperiment = fSelectedExperiment;\r
414 if (selectedExperiment == null) {\r
415 return;\r
416 }\r
417 for (ITmfTrace<?> trace : selectedExperiment.getTraces()) {\r
418 if (trace == signal.getTrace() && trace instanceof CtfKernelTrace) {\r
419 final Thread thread = new Thread("ResourcesView build") { //$NON-NLS-1$\r
420 @Override\r
421 public void run() {\r
422 // rebuild the model\r
423 selectExperiment(selectedExperiment);\r
424 }\r
425 };\r
426 thread.start();\r
427 }\r
428 }\r
429 }\r
430\r
49ffadb7
PT
431 // ------------------------------------------------------------------------\r
432 // Internal\r
433 // ------------------------------------------------------------------------\r
434\r
04835162
PT
435 @SuppressWarnings("unchecked")\r
436 private void selectExperiment(TmfExperiment<?> experiment) {\r
437 fStartTime = Long.MAX_VALUE;\r
438 fEndTime = Long.MIN_VALUE;\r
439 fSelectedExperiment = (TmfExperiment<ITmfEvent>) experiment;\r
8d8cb868 440 ArrayList<TraceEntry> entryList = new ArrayList<TraceEntry>();\r
04835162 441 for (ITmfTrace<?> trace : experiment.getTraces()) {\r
04835162
PT
442 if (trace instanceof CtfKernelTrace) {\r
443 CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace;\r
444 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
49ffadb7
PT
445 long startTime = ssq.getStartTime();\r
446 long endTime = ssq.getCurrentEndTime() + 1;\r
2c33fc31
BH
447 TraceEntry groupEntry = new TraceEntry(ctfKernelTrace, trace.getName(), startTime, endTime);\r
448 entryList.add(groupEntry);\r
49ffadb7
PT
449 fStartTime = Math.min(fStartTime, startTime);\r
450 fEndTime = Math.max(fEndTime, endTime);\r
04835162 451 List<Integer> cpuQuarks = ssq.getQuarks(Attributes.CPUS, "*"); //$NON-NLS-1$\r
49ffadb7
PT
452 ResourcesEntry[] cpuEntries = new ResourcesEntry[cpuQuarks.size()];\r
453 for (int i = 0; i < cpuQuarks.size(); i++) {\r
454 int cpuQuark = cpuQuarks.get(i);\r
455 int cpu = Integer.parseInt(ssq.getAttributeName(cpuQuark));\r
456 ResourcesEntry entry = new ResourcesEntry(cpuQuark, ctfKernelTrace, Type.CPU, cpu);\r
457 groupEntry.addChild(entry);\r
458 cpuEntries[i] = entry;\r
459 }\r
460 List<Integer> irqQuarks = ssq.getQuarks(Attributes.RESOURCES, Attributes.IRQS, "*"); //$NON-NLS-1$\r
461 ResourcesEntry[] irqEntries = new ResourcesEntry[irqQuarks.size()];\r
462 for (int i = 0; i < irqQuarks.size(); i++) {\r
463 int irqQuark = irqQuarks.get(i);\r
464 int irq = Integer.parseInt(ssq.getAttributeName(irqQuark));\r
465 ResourcesEntry entry = new ResourcesEntry(irqQuark, ctfKernelTrace, Type.IRQ, irq);\r
466 groupEntry.addChild(entry);\r
467 irqEntries[i] = entry;\r
468 }\r
469 List<Integer> softIrqQuarks = ssq.getQuarks(Attributes.RESOURCES, Attributes.SOFT_IRQS, "*"); //$NON-NLS-1$\r
470 ResourcesEntry[] softIrqEntries = new ResourcesEntry[softIrqQuarks.size()];\r
471 for (int i = 0; i < softIrqQuarks.size(); i++) {\r
472 int softIrqQuark = softIrqQuarks.get(i);\r
473 int softIrq = Integer.parseInt(ssq.getAttributeName(softIrqQuark));\r
474 ResourcesEntry entry = new ResourcesEntry(softIrqQuark, ctfKernelTrace, Type.SOFT_IRQ, softIrq);\r
475 groupEntry.addChild(entry);\r
476 softIrqEntries[i] = entry;\r
477 }\r
478 }\r
479 }\r
c19a8781
PT
480 synchronized (fEntryListSyncObj) {\r
481 fEntryList = (ArrayList<TraceEntry>) entryList.clone();\r
482 }\r
3ac6ad1a 483 refresh(INITIAL_WINDOW_OFFSET);\r
c19a8781 484 for (TraceEntry traceEntry : entryList) {\r
49ffadb7
PT
485 CtfKernelTrace ctfKernelTrace = ((TraceEntry) traceEntry).getTrace();\r
486 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
487 long startTime = ssq.getStartTime();\r
488 long endTime = ssq.getCurrentEndTime() + 1;\r
489 long resolution = (endTime - startTime) / fDisplayWidth;\r
490 for (ResourcesEntry entry : traceEntry.getChildren()) {\r
0137b624 491 List<ITimeEvent> eventList = getEventList(entry, startTime, endTime, resolution, false, new NullProgressMonitor());\r
49ffadb7
PT
492 entry.setEventList(eventList);\r
493 redraw();\r
494 }\r
495 }\r
496 }\r
497\r
0137b624 498 private List<ITimeEvent> getEventList(ResourcesEntry entry, long startTime, long endTime, long resolution, boolean includeNull, IProgressMonitor monitor) {\r
7264b6f2
PT
499 IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
500 startTime = Math.max(startTime, ssq.getStartTime());\r
501 endTime = Math.min(endTime, ssq.getCurrentEndTime() + 1);\r
0137b624
PT
502 if (endTime <= startTime) {\r
503 return null;\r
504 }\r
49ffadb7
PT
505 List<ITimeEvent> eventList = null;\r
506 int quark = entry.getQuark();\r
507 try {\r
508 if (entry.getType().equals(Type.CPU)) {\r
72b5abb1
PT
509 int statusQuark = ssq.getQuarkRelative(quark, Attributes.STATUS);\r
510 List<ITmfStateInterval> statusIntervals = ssq.queryHistoryRange(statusQuark, startTime, endTime - 1, resolution);\r
511 eventList = new ArrayList<ITimeEvent>(statusIntervals.size());\r
49ffadb7 512 long lastEndTime = -1;\r
72b5abb1 513 for (ITmfStateInterval statusInterval : statusIntervals) {\r
0137b624
PT
514 if (monitor.isCanceled()) {\r
515 return null;\r
516 }\r
72b5abb1
PT
517 int status = statusInterval.getStateValue().unboxInt();\r
518 long time = statusInterval.getStartTime();\r
519 long duration = statusInterval.getEndTime() - time + 1;\r
520 if (!statusInterval.getStateValue().isNull()) {\r
49ffadb7
PT
521 if (lastEndTime != time && lastEndTime != -1) {\r
522 eventList.add(new TimeEvent(entry, lastEndTime, time - lastEndTime));\r
cf7d106f 523 }\r
72b5abb1 524 eventList.add(new ResourcesEvent(entry, time, duration, status));\r
49ffadb7 525 lastEndTime = time + duration;\r
72b5abb1
PT
526 } else {\r
527 if (includeNull) {\r
528 eventList.add(new ResourcesEvent(entry, time, duration));\r
529 }\r
cf7d106f 530 }\r
49ffadb7
PT
531 }\r
532 } else if (entry.getType().equals(Type.IRQ)) {\r
533 List<ITmfStateInterval> irqIntervals = ssq.queryHistoryRange(quark, startTime, endTime - 1, resolution);\r
534 eventList = new ArrayList<ITimeEvent>(irqIntervals.size());\r
535 long lastEndTime = -1;\r
536 boolean lastIsNull = true;\r
537 for (ITmfStateInterval irqInterval : irqIntervals) {\r
0137b624
PT
538 if (monitor.isCanceled()) {\r
539 return null;\r
540 }\r
49ffadb7
PT
541 long time = irqInterval.getStartTime();\r
542 long duration = irqInterval.getEndTime() - time + 1;\r
543 if (!irqInterval.getStateValue().isNull()) {\r
544 int cpu = irqInterval.getStateValue().unboxInt();\r
545 eventList.add(new ResourcesEvent(entry, time, duration, cpu));\r
546 lastIsNull = false;\r
547 } else {\r
548 if (lastEndTime != time && lastEndTime != -1 && lastIsNull) {\r
549 eventList.add(new ResourcesEvent(entry, lastEndTime, time - lastEndTime, -1));\r
550 }\r
551 if (includeNull) {\r
552 eventList.add(new ResourcesEvent(entry, time, duration));\r
553 }\r
554 lastIsNull = true;\r
555 }\r
556 lastEndTime = time + duration;\r
557 }\r
558 } else if (entry.getType().equals(Type.SOFT_IRQ)) {\r
559 List<ITmfStateInterval> softIrqIntervals = ssq.queryHistoryRange(quark, startTime, endTime - 1, resolution);\r
560 eventList = new ArrayList<ITimeEvent>(softIrqIntervals.size());\r
561 long lastEndTime = -1;\r
562 boolean lastIsNull = true;\r
563 for (ITmfStateInterval softIrqInterval : softIrqIntervals) {\r
0137b624
PT
564 if (monitor.isCanceled()) {\r
565 return null;\r
566 }\r
49ffadb7
PT
567 long time = softIrqInterval.getStartTime();\r
568 long duration = softIrqInterval.getEndTime() - time + 1;\r
569 if (!softIrqInterval.getStateValue().isNull()) {\r
570 int cpu = softIrqInterval.getStateValue().unboxInt();\r
571 eventList.add(new ResourcesEvent(entry, time, duration, cpu));\r
572 } else {\r
573 if (lastEndTime != time && lastEndTime != -1 && lastIsNull) {\r
574 eventList.add(new ResourcesEvent(entry, lastEndTime, time - lastEndTime, -1));\r
575 }\r
576 if (includeNull) {\r
577 eventList.add(new ResourcesEvent(entry, time, duration));\r
578 }\r
579 lastIsNull = true;\r
580 }\r
581 lastEndTime = time + duration;\r
04835162
PT
582 }\r
583 }\r
49ffadb7
PT
584 } catch (AttributeNotFoundException e) {\r
585 e.printStackTrace();\r
586 } catch (TimeRangeException e) {\r
587 e.printStackTrace();\r
588 } catch (StateValueTypeException e) {\r
589 e.printStackTrace();\r
04835162 590 }\r
49ffadb7 591 return eventList;\r
04835162
PT
592 }\r
593\r
3ac6ad1a 594 private void refresh(final long windowRange) {\r
04835162
PT
595 Display.getDefault().asyncExec(new Runnable() {\r
596 @Override\r
597 public void run() {\r
598 if (fTimeGraphViewer.getControl().isDisposed()) {\r
599 return;\r
600 }\r
c19a8781
PT
601 ITimeGraphEntry[] entries = null;\r
602 synchronized (fEntryListSyncObj) {\r
603 entries = fEntryList.toArray(new ITimeGraphEntry[0]);\r
604 }\r
2c33fc31 605 Arrays.sort(entries, new TraceEntryComparator());\r
49ffadb7 606 fTimeGraphViewer.setInput(entries);\r
04835162 607 fTimeGraphViewer.setTimeBounds(fStartTime, fEndTime);\r
0137b624 608\r
3ac6ad1a
BH
609 long endTime = fStartTime + windowRange;\r
610\r
611 if (fEndTime < endTime) {\r
612 endTime = fEndTime;\r
613 }\r
614 fTimeGraphViewer.setStartFinishTime(fStartTime, endTime);\r
0137b624 615\r
3ac6ad1a 616 startZoomThread(fStartTime, endTime);\r
04835162
PT
617 }\r
618 });\r
619 }\r
620\r
49ffadb7
PT
621\r
622 private void redraw() {\r
623 Display.getDefault().asyncExec(new Runnable() {\r
624 @Override\r
625 public void run() {\r
626 if (fTimeGraphViewer.getControl().isDisposed()) {\r
627 return;\r
628 }\r
629 fTimeGraphViewer.getControl().redraw();\r
630 fTimeGraphViewer.getControl().update();\r
631 }\r
632 });\r
633 }\r
634\r
3ac6ad1a
BH
635 private void startZoomThread(long startTime, long endTime) {\r
636 if (fZoomThread != null) {\r
637 fZoomThread.cancel();\r
638 }\r
639 fZoomThread = new ZoomThread(startTime, endTime);\r
640 fZoomThread.start();\r
641 }\r
0137b624 642\r
49ffadb7
PT
643 private void makeActions() {\r
644 fPreviousResourceAction = fTimeGraphViewer.getPreviousItemAction();\r
645 fPreviousResourceAction.setText(Messages.ResourcesView_previousResourceActionNameText);\r
646 fPreviousResourceAction.setToolTipText(Messages.ResourcesView_previousResourceActionToolTipText);\r
647 fNextResourceAction = fTimeGraphViewer.getNextItemAction();\r
648 fNextResourceAction.setText(Messages.ResourcesView_nextResourceActionNameText);\r
649 fNextResourceAction.setToolTipText(Messages.ResourcesView_previousResourceActionToolTipText);\r
650 }\r
0137b624 651\r
49ffadb7
PT
652 private void contributeToActionBars() {\r
653 IActionBars bars = getViewSite().getActionBars();\r
654 fillLocalToolBar(bars.getToolBarManager());\r
655 }\r
0137b624 656\r
49ffadb7
PT
657 private void fillLocalToolBar(IToolBarManager manager) {\r
658 manager.add(fTimeGraphViewer.getShowLegendAction());\r
659 manager.add(new Separator());\r
660 manager.add(fTimeGraphViewer.getResetScaleAction());\r
661 manager.add(fTimeGraphViewer.getPreviousEventAction());\r
662 manager.add(fTimeGraphViewer.getNextEventAction());\r
663 manager.add(fPreviousResourceAction);\r
664 manager.add(fNextResourceAction);\r
665 manager.add(fTimeGraphViewer.getZoomInAction());\r
666 manager.add(fTimeGraphViewer.getZoomOutAction());\r
667 manager.add(new Separator());\r
668 }\r
04835162 669}\r
This page took 0.062667 seconds and 5 git commands to generate.