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