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