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