Bug 378401: Display CPU info for IRQ/SOFTIRQ in state ACTIVE
[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 284 public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event) {\r
b1941653
BH
285 \r
286 Map<String, String> retMap = new HashMap<String, String>();\r
287 if (event instanceof ResourcesEvent) {\r
288\r
289 ResourcesEvent resourcesEvent = (ResourcesEvent) event;\r
290\r
291 if (resourcesEvent.getType().equals(Type.IRQ) || resourcesEvent.getType().equals(Type.SOFT_IRQ)) {\r
292 int cpu = resourcesEvent.getValue();\r
293 if (cpu >= 0) {\r
294 retMap.put(Messages.ResourcesView_attributeCpuName, String.valueOf(cpu));\r
295 }\r
296 }\r
297 }\r
298\r
299 return retMap;\r
cf7d106f 300 }\r
0137b624 301\r
cf7d106f 302 @Override\r
49ffadb7
PT
303 public StateItem[] getStateTable() {\r
304 return new StateItem[] {\r
305 new StateItem(new RGB(100, 100, 100), UNKNOWN),\r
306 new StateItem(new RGB(200, 200, 200), IDLE),\r
307 new StateItem(new RGB(0, 200, 0), BUSY),\r
308 new StateItem(new RGB(200, 100, 100), INTERRUPTED),\r
309 new StateItem(new RGB(200, 200, 0), RAISED),\r
3ac6ad1a 310 new StateItem(new RGB(200, 150, 100), ACTIVE)\r
49ffadb7
PT
311 };\r
312 }\r
313\r
314 @Override\r
0137b624 315 public int getStateTableIndex(ITimeEvent event) {\r
49ffadb7
PT
316 if (event instanceof ResourcesEvent) {\r
317 ResourcesEvent resourcesEvent = (ResourcesEvent) event;\r
318 if (resourcesEvent.getType() == Type.CPU) {\r
319 int currentThread = resourcesEvent.getValue();\r
320 if (currentThread == 0) {\r
321 return 1; // IDLE\r
322 } else {\r
323 return 2; // BUSY\r
324 }\r
325 } else if (resourcesEvent.getType() == Type.IRQ || resourcesEvent.getType() == Type.SOFT_IRQ) {\r
326 int cpu = resourcesEvent.getValue();\r
327 if (cpu == Attributes.SOFT_IRQ_RAISED) {\r
328 return 4; // RAISED\r
329 }\r
330 return 5; // ACTIVE\r
331 } else {\r
332 return -1; // NULL\r
333 }\r
334 }\r
335 return 0; // UNKNOWN\r
336 }\r
337 });\r
338\r
339 fTimeGraphViewer.setTimeCalendarFormat(true);\r
340\r
341 fTimeGraphViewer.addRangeListener(new ITimeGraphRangeListener() {\r
342 @Override\r
343 public void timeRangeUpdated(TimeGraphRangeUpdateEvent event) {\r
344 long startTime = event.getStartTime();\r
345 long endTime = event.getEndTime();\r
346 TmfTimeRange range = new TmfTimeRange(new CtfTmfTimestamp(startTime), new CtfTmfTimestamp(endTime));\r
347 TmfTimestamp time = new CtfTmfTimestamp(fTimeGraphViewer.getSelectedTime());\r
348 broadcast(new TmfRangeSynchSignal(ResourcesView.this, range, time));\r
3ac6ad1a 349 startZoomThread(startTime, endTime);\r
04835162
PT
350 }\r
351 });\r
352\r
49ffadb7
PT
353 fTimeGraphViewer.addTimeListener(new ITimeGraphTimeListener() {\r
354 @Override\r
355 public void timeSelected(TimeGraphTimeEvent event) {\r
356 long time = event.getTime();\r
357 broadcast(new TmfTimeSynchSignal(ResourcesView.this, new CtfTmfTimestamp(time)));\r
358 }\r
359 });\r
360\r
361 final Thread thread = new Thread("ResourcesView build") { //$NON-NLS-1$\r
04835162
PT
362 @Override\r
363 public void run() {\r
364 if (TmfExperiment.getCurrentExperiment() != null) {\r
365 selectExperiment(TmfExperiment.getCurrentExperiment());\r
366 }\r
367 }\r
368 };\r
369 thread.start();\r
0137b624 370\r
49ffadb7
PT
371 // View Action Handling\r
372 makeActions();\r
373 contributeToActionBars();\r
04835162
PT
374 }\r
375\r
376 /* (non-Javadoc)\r
377 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()\r
378 */\r
379 @Override\r
380 public void setFocus() {\r
381 fTimeGraphViewer.setFocus();\r
382 }\r
383\r
384 // ------------------------------------------------------------------------\r
385 // Signal handlers\r
386 // ------------------------------------------------------------------------\r
387\r
388 @TmfSignalHandler\r
389 public void experimentSelected(final TmfExperimentSelectedSignal<? extends TmfEvent> signal) {\r
390 if (signal.getExperiment().equals(fSelectedExperiment)) {\r
391 return;\r
392 }\r
393\r
49ffadb7 394 final Thread thread = new Thread("ResourcesView build") { //$NON-NLS-1$\r
04835162
PT
395 @Override\r
396 public void run() {\r
397 selectExperiment(signal.getExperiment());\r
0137b624
PT
398 }\r
399 };\r
04835162
PT
400 thread.start();\r
401 }\r
402\r
49ffadb7
PT
403 @TmfSignalHandler\r
404 public void synchToTime(final TmfTimeSynchSignal signal) {\r
405 if (signal.getSource() == this) {\r
406 return;\r
407 }\r
408 final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
409 Display.getDefault().asyncExec(new Runnable() {\r
410 @Override\r
411 public void run() {\r
412 if (fTimeGraphViewer.getControl().isDisposed()) {\r
413 return;\r
414 }\r
3ac6ad1a 415 fTimeGraphViewer.setSelectedTime(time, true);\r
49ffadb7
PT
416 }\r
417 });\r
418 }\r
419\r
420 @TmfSignalHandler\r
421 public void synchToRange(final TmfRangeSynchSignal signal) {\r
422 if (signal.getSource() == this) {\r
423 return;\r
424 }\r
425 final long startTime = signal.getCurrentRange().getStartTime().normalize(0, -9).getValue();\r
426 final long endTime = signal.getCurrentRange().getEndTime().normalize(0, -9).getValue();\r
427 final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
428 Display.getDefault().asyncExec(new Runnable() {\r
429 @Override\r
430 public void run() {\r
431 if (fTimeGraphViewer.getControl().isDisposed()) {\r
432 return;\r
433 }\r
434 fTimeGraphViewer.setStartFinishTime(startTime, endTime);\r
3ac6ad1a
BH
435 fTimeGraphViewer.setSelectedTime(time, true);\r
436 startZoomThread(startTime, endTime);\r
49ffadb7
PT
437 }\r
438 });\r
439 }\r
440\r
441 // ------------------------------------------------------------------------\r
442 // Internal\r
443 // ------------------------------------------------------------------------\r
444\r
04835162
PT
445 @SuppressWarnings("unchecked")\r
446 private void selectExperiment(TmfExperiment<?> experiment) {\r
447 fStartTime = Long.MAX_VALUE;\r
448 fEndTime = Long.MIN_VALUE;\r
449 fSelectedExperiment = (TmfExperiment<ITmfEvent>) experiment;\r
49ffadb7 450 fEntryList = new ArrayList<TraceEntry>();\r
04835162 451 for (ITmfTrace<?> trace : experiment.getTraces()) {\r
04835162
PT
452 if (trace instanceof CtfKernelTrace) {\r
453 CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace;\r
49ffadb7
PT
454 TraceEntry groupEntry = new TraceEntry(ctfKernelTrace, trace.getName());\r
455 fEntryList.add(groupEntry);\r
04835162 456 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
49ffadb7
PT
457 long startTime = ssq.getStartTime();\r
458 long endTime = ssq.getCurrentEndTime() + 1;\r
459 fStartTime = Math.min(fStartTime, startTime);\r
460 fEndTime = Math.max(fEndTime, endTime);\r
04835162 461 List<Integer> cpuQuarks = ssq.getQuarks(Attributes.CPUS, "*"); //$NON-NLS-1$\r
49ffadb7
PT
462 ResourcesEntry[] cpuEntries = new ResourcesEntry[cpuQuarks.size()];\r
463 for (int i = 0; i < cpuQuarks.size(); i++) {\r
464 int cpuQuark = cpuQuarks.get(i);\r
465 int cpu = Integer.parseInt(ssq.getAttributeName(cpuQuark));\r
466 ResourcesEntry entry = new ResourcesEntry(cpuQuark, ctfKernelTrace, Type.CPU, cpu);\r
467 groupEntry.addChild(entry);\r
468 cpuEntries[i] = entry;\r
469 }\r
470 List<Integer> irqQuarks = ssq.getQuarks(Attributes.RESOURCES, Attributes.IRQS, "*"); //$NON-NLS-1$\r
471 ResourcesEntry[] irqEntries = new ResourcesEntry[irqQuarks.size()];\r
472 for (int i = 0; i < irqQuarks.size(); i++) {\r
473 int irqQuark = irqQuarks.get(i);\r
474 int irq = Integer.parseInt(ssq.getAttributeName(irqQuark));\r
475 ResourcesEntry entry = new ResourcesEntry(irqQuark, ctfKernelTrace, Type.IRQ, irq);\r
476 groupEntry.addChild(entry);\r
477 irqEntries[i] = entry;\r
478 }\r
479 List<Integer> softIrqQuarks = ssq.getQuarks(Attributes.RESOURCES, Attributes.SOFT_IRQS, "*"); //$NON-NLS-1$\r
480 ResourcesEntry[] softIrqEntries = new ResourcesEntry[softIrqQuarks.size()];\r
481 for (int i = 0; i < softIrqQuarks.size(); i++) {\r
482 int softIrqQuark = softIrqQuarks.get(i);\r
483 int softIrq = Integer.parseInt(ssq.getAttributeName(softIrqQuark));\r
484 ResourcesEntry entry = new ResourcesEntry(softIrqQuark, ctfKernelTrace, Type.SOFT_IRQ, softIrq);\r
485 groupEntry.addChild(entry);\r
486 softIrqEntries[i] = entry;\r
487 }\r
488 }\r
489 }\r
3ac6ad1a 490 refresh(INITIAL_WINDOW_OFFSET);\r
49ffadb7
PT
491 for (TraceEntry traceEntry : fEntryList) {\r
492 CtfKernelTrace ctfKernelTrace = ((TraceEntry) traceEntry).getTrace();\r
493 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
494 long startTime = ssq.getStartTime();\r
495 long endTime = ssq.getCurrentEndTime() + 1;\r
496 long resolution = (endTime - startTime) / fDisplayWidth;\r
497 for (ResourcesEntry entry : traceEntry.getChildren()) {\r
0137b624 498 List<ITimeEvent> eventList = getEventList(entry, startTime, endTime, resolution, false, new NullProgressMonitor());\r
49ffadb7
PT
499 entry.setEventList(eventList);\r
500 redraw();\r
501 }\r
502 }\r
503 }\r
504\r
0137b624
PT
505 private List<ITimeEvent> getEventList(ResourcesEntry entry, long startTime, long endTime, long resolution, boolean includeNull, IProgressMonitor monitor) {\r
506 if (endTime <= startTime) {\r
507 return null;\r
508 }\r
49ffadb7
PT
509 IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
510 List<ITimeEvent> eventList = null;\r
511 int quark = entry.getQuark();\r
512 try {\r
513 if (entry.getType().equals(Type.CPU)) {\r
514 int currentThreadQuark = ssq.getQuarkRelative(quark, Attributes.CURRENT_THREAD);\r
515 List<ITmfStateInterval> currentThreadIntervals = ssq.queryHistoryRange(currentThreadQuark, startTime, endTime - 1, resolution);\r
516 eventList = new ArrayList<ITimeEvent>(currentThreadIntervals.size());\r
517 long lastEndTime = -1;\r
518 for (ITmfStateInterval currentThreadInterval : currentThreadIntervals) {\r
0137b624
PT
519 if (monitor.isCanceled()) {\r
520 return null;\r
521 }\r
49ffadb7
PT
522 if (!currentThreadInterval.getStateValue().isNull()) {\r
523 int currentThread = currentThreadInterval.getStateValue().unboxInt();\r
524 long time = currentThreadInterval.getStartTime();\r
525 long duration = currentThreadInterval.getEndTime() - time + 1;\r
526 if (lastEndTime != time && lastEndTime != -1) {\r
527 eventList.add(new TimeEvent(entry, lastEndTime, time - lastEndTime));\r
cf7d106f 528 }\r
49ffadb7
PT
529 eventList.add(new ResourcesEvent(entry, time, duration, currentThread));\r
530 lastEndTime = time + duration;\r
cf7d106f 531 }\r
49ffadb7
PT
532 }\r
533 } else if (entry.getType().equals(Type.IRQ)) {\r
534 List<ITmfStateInterval> irqIntervals = ssq.queryHistoryRange(quark, startTime, endTime - 1, resolution);\r
535 eventList = new ArrayList<ITimeEvent>(irqIntervals.size());\r
536 long lastEndTime = -1;\r
537 boolean lastIsNull = true;\r
538 for (ITmfStateInterval irqInterval : irqIntervals) {\r
0137b624
PT
539 if (monitor.isCanceled()) {\r
540 return null;\r
541 }\r
49ffadb7
PT
542 long time = irqInterval.getStartTime();\r
543 long duration = irqInterval.getEndTime() - time + 1;\r
544 if (!irqInterval.getStateValue().isNull()) {\r
545 int cpu = irqInterval.getStateValue().unboxInt();\r
546 eventList.add(new ResourcesEvent(entry, time, duration, cpu));\r
547 lastIsNull = false;\r
548 } else {\r
549 if (lastEndTime != time && lastEndTime != -1 && lastIsNull) {\r
550 eventList.add(new ResourcesEvent(entry, lastEndTime, time - lastEndTime, -1));\r
551 }\r
552 if (includeNull) {\r
553 eventList.add(new ResourcesEvent(entry, time, duration));\r
554 }\r
555 lastIsNull = true;\r
556 }\r
557 lastEndTime = time + duration;\r
558 }\r
559 } else if (entry.getType().equals(Type.SOFT_IRQ)) {\r
560 List<ITmfStateInterval> softIrqIntervals = ssq.queryHistoryRange(quark, startTime, endTime - 1, resolution);\r
561 eventList = new ArrayList<ITimeEvent>(softIrqIntervals.size());\r
562 long lastEndTime = -1;\r
563 boolean lastIsNull = true;\r
564 for (ITmfStateInterval softIrqInterval : softIrqIntervals) {\r
0137b624
PT
565 if (monitor.isCanceled()) {\r
566 return null;\r
567 }\r
49ffadb7
PT
568 long time = softIrqInterval.getStartTime();\r
569 long duration = softIrqInterval.getEndTime() - time + 1;\r
570 if (!softIrqInterval.getStateValue().isNull()) {\r
571 int cpu = softIrqInterval.getStateValue().unboxInt();\r
572 eventList.add(new ResourcesEvent(entry, time, duration, cpu));\r
573 } else {\r
574 if (lastEndTime != time && lastEndTime != -1 && lastIsNull) {\r
575 eventList.add(new ResourcesEvent(entry, lastEndTime, time - lastEndTime, -1));\r
576 }\r
577 if (includeNull) {\r
578 eventList.add(new ResourcesEvent(entry, time, duration));\r
579 }\r
580 lastIsNull = true;\r
581 }\r
582 lastEndTime = time + duration;\r
04835162
PT
583 }\r
584 }\r
49ffadb7
PT
585 } catch (AttributeNotFoundException e) {\r
586 e.printStackTrace();\r
587 } catch (TimeRangeException e) {\r
588 e.printStackTrace();\r
589 } catch (StateValueTypeException e) {\r
590 e.printStackTrace();\r
04835162 591 }\r
49ffadb7 592 return eventList;\r
04835162
PT
593 }\r
594\r
3ac6ad1a 595 private void refresh(final long windowRange) {\r
04835162
PT
596 Display.getDefault().asyncExec(new Runnable() {\r
597 @Override\r
598 public void run() {\r
599 if (fTimeGraphViewer.getControl().isDisposed()) {\r
600 return;\r
601 }\r
49ffadb7
PT
602 ITimeGraphEntry[] entries = fEntryList.toArray(new ITimeGraphEntry[0]);\r
603 Arrays.sort(entries);\r
604 fTimeGraphViewer.setInput(entries);\r
04835162 605 fTimeGraphViewer.setTimeBounds(fStartTime, fEndTime);\r
0137b624 606\r
3ac6ad1a
BH
607 long endTime = fStartTime + windowRange;\r
608\r
609 if (fEndTime < endTime) {\r
610 endTime = fEndTime;\r
611 }\r
612 fTimeGraphViewer.setStartFinishTime(fStartTime, endTime);\r
0137b624 613\r
3ac6ad1a 614 startZoomThread(fStartTime, endTime);\r
04835162
PT
615 }\r
616 });\r
617 }\r
618\r
49ffadb7
PT
619\r
620 private void redraw() {\r
621 Display.getDefault().asyncExec(new Runnable() {\r
622 @Override\r
623 public void run() {\r
624 if (fTimeGraphViewer.getControl().isDisposed()) {\r
625 return;\r
626 }\r
627 fTimeGraphViewer.getControl().redraw();\r
628 fTimeGraphViewer.getControl().update();\r
629 }\r
630 });\r
631 }\r
632\r
3ac6ad1a
BH
633 private void startZoomThread(long startTime, long endTime) {\r
634 if (fZoomThread != null) {\r
635 fZoomThread.cancel();\r
636 }\r
637 fZoomThread = new ZoomThread(startTime, endTime);\r
638 fZoomThread.start();\r
639 }\r
0137b624 640\r
49ffadb7
PT
641 private void makeActions() {\r
642 fPreviousResourceAction = fTimeGraphViewer.getPreviousItemAction();\r
643 fPreviousResourceAction.setText(Messages.ResourcesView_previousResourceActionNameText);\r
644 fPreviousResourceAction.setToolTipText(Messages.ResourcesView_previousResourceActionToolTipText);\r
645 fNextResourceAction = fTimeGraphViewer.getNextItemAction();\r
646 fNextResourceAction.setText(Messages.ResourcesView_nextResourceActionNameText);\r
647 fNextResourceAction.setToolTipText(Messages.ResourcesView_previousResourceActionToolTipText);\r
648 }\r
0137b624 649\r
49ffadb7
PT
650 private void contributeToActionBars() {\r
651 IActionBars bars = getViewSite().getActionBars();\r
652 fillLocalToolBar(bars.getToolBarManager());\r
653 }\r
0137b624 654\r
49ffadb7
PT
655 private void fillLocalToolBar(IToolBarManager manager) {\r
656 manager.add(fTimeGraphViewer.getShowLegendAction());\r
657 manager.add(new Separator());\r
658 manager.add(fTimeGraphViewer.getResetScaleAction());\r
659 manager.add(fTimeGraphViewer.getPreviousEventAction());\r
660 manager.add(fTimeGraphViewer.getNextEventAction());\r
661 manager.add(fPreviousResourceAction);\r
662 manager.add(fNextResourceAction);\r
663 manager.add(fTimeGraphViewer.getZoomInAction());\r
664 manager.add(fTimeGraphViewer.getZoomOutAction());\r
665 manager.add(new Separator());\r
666 }\r
04835162 667}\r
This page took 0.060666 seconds and 5 git commands to generate.