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