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