Fix for bug 382158: Performance issues with event table filtering.
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng2.kernel.ui / src / org / eclipse / linuxtools / internal / lttng2 / kernel / ui / views / controlflow / ControlFlowView.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.controlflow;\r
14\r
15import java.util.ArrayList;\r
16import java.util.Arrays;\r
15c04058 17import java.util.Collections;\r
2c33fc31 18import java.util.Comparator;\r
04835162 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
04835162
PT
26import org.eclipse.jface.viewers.ILabelProviderListener;\r
27import org.eclipse.jface.viewers.ITableLabelProvider;\r
28import org.eclipse.jface.viewers.ITreeContentProvider;\r
29import org.eclipse.jface.viewers.Viewer;\r
3e97fbfa 30import org.eclipse.linuxtools.internal.lttng2.kernel.core.Attributes;\r
04835162 31import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Messages;\r
04835162 32import org.eclipse.linuxtools.lttng2.kernel.core.trace.CtfKernelTrace;\r
49ffadb7 33import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfTimestamp;\r
04835162 34import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;\r
49ffadb7
PT
35import org.eclipse.linuxtools.tmf.core.event.TmfTimeRange;\r
36import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;\r
04835162
PT
37import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException;\r
38import org.eclipse.linuxtools.tmf.core.exceptions.StateValueTypeException;\r
39import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException;\r
04835162
PT
40import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval;\r
41import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal;\r
49ffadb7 42import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal;\r
04835162 43import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;\r
b987050f 44import org.eclipse.linuxtools.tmf.core.signal.TmfStateSystemBuildCompleted;\r
49ffadb7 45import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal;\r
04835162
PT
46import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier;\r
47import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;\r
9e0640dc 48import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;\r
04835162
PT
49import org.eclipse.linuxtools.tmf.ui.views.TmfView;\r
50import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphRangeListener;\r
51import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphSelectionListener;\r
52import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphTimeListener;\r
53import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphCombo;\r
04835162
PT
54import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphRangeUpdateEvent;\r
55import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphSelectionEvent;\r
56import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphTimeEvent;\r
57import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
58import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
59import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeEvent;\r
49ffadb7
PT
60import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils;\r
61import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils.Resolution;\r
62import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat;\r
04835162
PT
63import org.eclipse.swt.SWT;\r
64import org.eclipse.swt.graphics.Image;\r
65import org.eclipse.swt.widgets.Composite;\r
66import org.eclipse.swt.widgets.Display;\r
49ffadb7
PT
67import org.eclipse.swt.widgets.TreeColumn;\r
68import org.eclipse.ui.IActionBars;\r
04835162
PT
69\r
70public class ControlFlowView extends TmfView {\r
71\r
72 // ------------------------------------------------------------------------\r
73 // Constants\r
74 // ------------------------------------------------------------------------\r
75\r
76 /**\r
77 * View ID.\r
78 */\r
79 public static final String ID = "org.eclipse.linuxtools.lttng2.kernel.ui.views.controlflow"; //$NON-NLS-1$\r
80\r
3ac6ad1a
BH
81 /**\r
82 * Initial time range\r
83 */\r
84 private static final long INITIAL_WINDOW_OFFSET = (1L * 100 * 1000 * 1000); // .1sec\r
0137b624 85\r
49ffadb7
PT
86 private static final String PROCESS_COLUMN = Messages.ControlFlowView_processColumn;\r
87 private static final String TID_COLUMN = Messages.ControlFlowView_tidColumn;\r
3d90c4ff 88 private static final String PTID_COLUMN = Messages.ControlFlowView_ptidColumn;\r
49ffadb7
PT
89 private static final String BIRTH_TIME_COLUMN = Messages.ControlFlowView_birthTimeColumn;\r
90 private static final String TRACE_COLUMN = Messages.ControlFlowView_traceColumn;\r
04835162
PT
91\r
92 private final String[] COLUMN_NAMES = new String[] {\r
93 PROCESS_COLUMN,\r
94 TID_COLUMN,\r
3d90c4ff 95 PTID_COLUMN,\r
49ffadb7 96 BIRTH_TIME_COLUMN,\r
04835162
PT
97 TRACE_COLUMN\r
98 };\r
99\r
100 // ------------------------------------------------------------------------\r
101 // Fields\r
102 // ------------------------------------------------------------------------\r
103\r
104 // The timegraph combo\r
105 private TimeGraphCombo fTimeGraphCombo;\r
106\r
107 // The selected experiment\r
108 private TmfExperiment<ITmfEvent> fSelectedExperiment;\r
109\r
110 // The timegraph entry list\r
49ffadb7 111 private ArrayList<ControlFlowEntry> fEntryList;\r
04835162
PT
112\r
113 // The start time\r
114 private long fStartTime;\r
115\r
116 // The end time\r
117 private long fEndTime;\r
118\r
49ffadb7
PT
119 // The display width\r
120 private int fDisplayWidth;\r
121\r
122 // The zoom thread\r
123 private ZoomThread fZoomThread;\r
0137b624 124\r
49ffadb7
PT
125 // The next resource action\r
126 private Action fNextResourceAction;\r
0137b624 127\r
49ffadb7
PT
128 // The previous resource action\r
129 private Action fPreviousResourceAction;\r
2c33fc31
BH
130 \r
131 // A comparator class\r
132 private ControlFlowEntryComparator fControlFlowEntryComparator = new ControlFlowEntryComparator();\r
49ffadb7 133\r
04835162
PT
134 // ------------------------------------------------------------------------\r
135 // Classes\r
136 // ------------------------------------------------------------------------\r
137\r
138 private class TreeContentProvider implements ITreeContentProvider {\r
139\r
140 @Override\r
141 public void dispose() {\r
142 }\r
143\r
144 @Override\r
145 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
146 }\r
147\r
148 @Override\r
149 public Object[] getElements(Object inputElement) {\r
150 return (ITimeGraphEntry[]) inputElement;\r
151 }\r
152\r
153 @Override\r
154 public Object[] getChildren(Object parentElement) {\r
155 ITimeGraphEntry entry = (ITimeGraphEntry) parentElement;\r
156 return entry.getChildren();\r
157 }\r
158\r
159 @Override\r
160 public Object getParent(Object element) {\r
161 ITimeGraphEntry entry = (ITimeGraphEntry) element;\r
162 return entry.getParent();\r
163 }\r
164\r
165 @Override\r
166 public boolean hasChildren(Object element) {\r
167 ITimeGraphEntry entry = (ITimeGraphEntry) element;\r
168 return entry.hasChildren();\r
169 }\r
0137b624 170\r
04835162
PT
171 }\r
172\r
173 private class TreeLabelProvider implements ITableLabelProvider {\r
174\r
175 @Override\r
176 public void addListener(ILabelProviderListener listener) {\r
177 }\r
178\r
179 @Override\r
180 public void dispose() {\r
181 }\r
182\r
183 @Override\r
184 public boolean isLabelProperty(Object element, String property) {\r
185 return false;\r
186 }\r
187\r
188 @Override\r
189 public void removeListener(ILabelProviderListener listener) {\r
190 }\r
191\r
192 @Override\r
193 public Image getColumnImage(Object element, int columnIndex) {\r
194 return null;\r
195 }\r
196\r
197 @Override\r
198 public String getColumnText(Object element, int columnIndex) {\r
199 ControlFlowEntry entry = (ControlFlowEntry) element;\r
200 if (columnIndex == 0) {\r
201 return entry.getName();\r
202 } else if (columnIndex == 1) {\r
203 return Integer.toString(entry.getThreadId());\r
49ffadb7 204 } else if (columnIndex == 2) {\r
3d90c4ff
PT
205 if (entry.getParentThreadId() > 0) {\r
206 return Integer.toString(entry.getParentThreadId());\r
04835162 207 }\r
49ffadb7
PT
208 } else if (columnIndex == 3) {\r
209 return Utils.formatTime(entry.getBirthTime(), TimeFormat.ABSOLUTE, Resolution.NANOSEC);\r
210 } else if (columnIndex == 4) {\r
211 return entry.getTrace().getName();\r
04835162
PT
212 }\r
213 return ""; //$NON-NLS-1$\r
214 }\r
0137b624 215\r
04835162
PT
216 }\r
217\r
2c33fc31
BH
218 private static class ControlFlowEntryComparator implements Comparator<ITimeGraphEntry> {\r
219\r
220 @Override\r
221 public int compare(ITimeGraphEntry o1, ITimeGraphEntry o2) {\r
222 int result = 0;\r
223\r
224 if ((o1 instanceof ControlFlowEntry) && (o2 instanceof ControlFlowEntry)) {\r
225 ControlFlowEntry entry1 = (ControlFlowEntry) o1;\r
226 ControlFlowEntry entry2 = (ControlFlowEntry) o2;\r
227 result = entry1.getTrace().getStartTime().compareTo(entry2.getTrace().getStartTime());\r
15c04058
PT
228 if (result == 0) {\r
229 result = entry1.getTrace().getName().compareTo(entry2.getTrace().getName());\r
230 }\r
2c33fc31
BH
231 if (result == 0) {\r
232 result = entry1.getThreadId() < entry2.getThreadId() ? -1 : entry1.getThreadId() > entry2.getThreadId() ? 1 : 0;\r
233 }\r
234 }\r
235\r
236 if (result == 0) {\r
237 result = o1.getStartTime() < o2.getStartTime() ? -1 : o1.getStartTime() > o2.getStartTime() ? 1 : 0;\r
238 }\r
239\r
240 return result;\r
241 }\r
242 }\r
243\r
244 \r
49ffadb7 245 private class ZoomThread extends Thread {\r
3ac6ad1a
BH
246 private long fZoomStartTime;\r
247 private long fZoomEndTime;\r
49ffadb7 248 private long fResolution;\r
0137b624 249 private IProgressMonitor fMonitor;\r
49ffadb7
PT
250\r
251 public ZoomThread(long startTime, long endTime) {\r
252 super("ControlFlowView zoom"); //$NON-NLS-1$\r
3ac6ad1a
BH
253 fZoomStartTime = startTime;\r
254 fZoomEndTime = endTime;\r
255 fResolution = Math.max(1, (fZoomEndTime - fZoomStartTime) / fDisplayWidth);\r
0137b624 256 fMonitor = new NullProgressMonitor();\r
49ffadb7
PT
257 }\r
258\r
259 @Override\r
260 public void run() {\r
8d8cb868
PT
261 ArrayList<ControlFlowEntry> entryList = fEntryList;\r
262 if (entryList == null) {\r
49ffadb7
PT
263 return;\r
264 }\r
8d8cb868 265 for (ControlFlowEntry entry : entryList) {\r
0137b624 266 if (fMonitor.isCanceled()) {\r
5929fada 267 break;\r
49ffadb7 268 }\r
0137b624 269 zoom(entry, fMonitor);\r
49ffadb7
PT
270 }\r
271 redraw();\r
272 }\r
273\r
0137b624 274 private void zoom(ControlFlowEntry entry, IProgressMonitor monitor) {\r
f7ddf9b3 275 if (fZoomStartTime <= fStartTime && fZoomEndTime >= fEndTime) {\r
b987050f 276 entry.setZoomedEventList(null);\r
5929fada
PT
277 } else {\r
278 List<ITimeEvent> zoomedEventList = getEventList(entry, fZoomStartTime, fZoomEndTime, fResolution, monitor);\r
279 if (zoomedEventList != null) {\r
280 entry.setZoomedEventList(zoomedEventList);\r
281 }\r
0137b624 282 }\r
49ffadb7 283 for (ControlFlowEntry child : entry.getChildren()) {\r
0137b624 284 if (fMonitor.isCanceled()) {\r
49ffadb7
PT
285 return;\r
286 }\r
0137b624 287 zoom(child, monitor);\r
49ffadb7
PT
288 }\r
289 }\r
290\r
291 public void cancel() {\r
0137b624 292 fMonitor.setCanceled(true);\r
49ffadb7
PT
293 }\r
294 }\r
295\r
04835162
PT
296 // ------------------------------------------------------------------------\r
297 // Constructors\r
298 // ------------------------------------------------------------------------\r
299\r
300 public ControlFlowView() {\r
301 super(ID);\r
49ffadb7 302 fDisplayWidth = Display.getDefault().getBounds().width;\r
04835162
PT
303 }\r
304\r
305 // ------------------------------------------------------------------------\r
306 // ViewPart\r
307 // ------------------------------------------------------------------------\r
308\r
309 /* (non-Javadoc)\r
310 * @see org.eclipse.linuxtools.tmf.ui.views.TmfView#createPartControl(org.eclipse.swt.widgets.Composite)\r
311 */\r
312 @Override\r
313 public void createPartControl(Composite parent) {\r
314 fTimeGraphCombo = new TimeGraphCombo(parent, SWT.NONE);\r
315\r
316 fTimeGraphCombo.setTreeContentProvider(new TreeContentProvider());\r
317\r
318 fTimeGraphCombo.setTreeLabelProvider(new TreeLabelProvider());\r
319\r
72b5abb1 320 fTimeGraphCombo.setTimeGraphProvider(new ControlFlowPresentationProvider());\r
04835162
PT
321\r
322 fTimeGraphCombo.setTreeColumns(COLUMN_NAMES);\r
323\r
324 fTimeGraphCombo.getTimeGraphViewer().addRangeListener(new ITimeGraphRangeListener() {\r
325 @Override\r
326 public void timeRangeUpdated(TimeGraphRangeUpdateEvent event) {\r
49ffadb7
PT
327 final long startTime = event.getStartTime();\r
328 final long endTime = event.getEndTime();\r
329 TmfTimeRange range = new TmfTimeRange(new CtfTmfTimestamp(startTime), new CtfTmfTimestamp(endTime));\r
330 TmfTimestamp time = new CtfTmfTimestamp(fTimeGraphCombo.getTimeGraphViewer().getSelectedTime());\r
331 broadcast(new TmfRangeSynchSignal(ControlFlowView.this, range, time));\r
332 if (fZoomThread != null) {\r
333 fZoomThread.cancel();\r
334 }\r
3ac6ad1a 335 startZoomThread(startTime, endTime);\r
04835162
PT
336 }\r
337 });\r
338\r
339 fTimeGraphCombo.getTimeGraphViewer().addTimeListener(new ITimeGraphTimeListener() {\r
340 @Override\r
341 public void timeSelected(TimeGraphTimeEvent event) {\r
342 long time = event.getTime();\r
49ffadb7 343 broadcast(new TmfTimeSynchSignal(ControlFlowView.this, new CtfTmfTimestamp(time)));\r
04835162
PT
344 }\r
345 });\r
346\r
347 fTimeGraphCombo.addSelectionListener(new ITimeGraphSelectionListener() {\r
348 @Override\r
349 public void selectionChanged(TimeGraphSelectionEvent event) {\r
49ffadb7 350 //ITimeGraphEntry selection = event.getSelection();\r
04835162
PT
351 }\r
352 });\r
353\r
49ffadb7
PT
354 fTimeGraphCombo.getTimeGraphViewer().setTimeCalendarFormat(true);\r
355\r
356 final Thread thread = new Thread("ControlFlowView build") { //$NON-NLS-1$\r
04835162
PT
357 @Override\r
358 public void run() {\r
359 if (TmfExperiment.getCurrentExperiment() != null) {\r
360 selectExperiment(TmfExperiment.getCurrentExperiment());\r
361 }\r
362 }\r
363 };\r
364 thread.start();\r
0137b624 365\r
49ffadb7
PT
366 // View Action Handling\r
367 makeActions();\r
368 contributeToActionBars();\r
04835162
PT
369 }\r
370\r
371 /* (non-Javadoc)\r
372 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()\r
373 */\r
374 @Override\r
375 public void setFocus() {\r
376 fTimeGraphCombo.setFocus();\r
377 }\r
378\r
379 // ------------------------------------------------------------------------\r
380 // Signal handlers\r
381 // ------------------------------------------------------------------------\r
382\r
383 @TmfSignalHandler\r
384 public void experimentSelected(final TmfExperimentSelectedSignal<? extends ITmfEvent> signal) {\r
385 if (signal.getExperiment().equals(fSelectedExperiment)) {\r
386 return;\r
387 }\r
388\r
49ffadb7 389 final Thread thread = new Thread("ControlFlowView build") { //$NON-NLS-1$\r
04835162
PT
390 @Override\r
391 public void run() {\r
392 selectExperiment(signal.getExperiment());\r
0137b624
PT
393 }\r
394 };\r
49ffadb7
PT
395 thread.start();\r
396 }\r
397\r
398 @TmfSignalHandler\r
399 public void synchToTime(final TmfTimeSynchSignal signal) {\r
400 if (signal.getSource() == this) {\r
401 return;\r
402 }\r
403 final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
0137b624
PT
404\r
405 int thread = -1;\r
406 for (ITmfTrace<?> trace : fSelectedExperiment.getTraces()) {\r
407 if (thread > 0) {\r
408 break;\r
409 }\r
410 if (trace instanceof CtfKernelTrace) {\r
411 CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace;\r
412 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
413 if (time >= ssq.getStartTime() && time <= ssq.getCurrentEndTime()) {\r
414 List<Integer> currentThreadQuarks = ssq.getQuarks(Attributes.CPUS, "*", Attributes.CURRENT_THREAD); //$NON-NLS-1$\r
415 for (int currentThreadQuark : currentThreadQuarks) {\r
416 try {\r
417 ITmfStateInterval currentThreadInterval = ssq.querySingleState(time, currentThreadQuark);\r
418 int currentThread = currentThreadInterval.getStateValue().unboxInt();\r
419 if (currentThread > 0) {\r
420 int statusQuark = ssq.getQuarkAbsolute(Attributes.THREADS, Integer.toString(currentThread), Attributes.STATUS);\r
421 ITmfStateInterval statusInterval = ssq.querySingleState(time, statusQuark);\r
422 if (statusInterval.getStartTime() == time) {\r
423 thread = currentThread;\r
424 break;\r
425 }\r
426 }\r
427 } catch (AttributeNotFoundException e) {\r
428 e.printStackTrace();\r
429 } catch (TimeRangeException e) {\r
430 e.printStackTrace();\r
431 } catch (StateValueTypeException e) {\r
432 e.printStackTrace();\r
433 }\r
434 }\r
435 }\r
436 }\r
437 }\r
438 final int selectedThread = thread;\r
439 \r
49ffadb7
PT
440 Display.getDefault().asyncExec(new Runnable() {\r
441 @Override\r
442 public void run() {\r
443 if (fTimeGraphCombo.isDisposed()) {\r
444 return;\r
445 }\r
3ac6ad1a 446 fTimeGraphCombo.getTimeGraphViewer().setSelectedTime(time, true);\r
0137b624
PT
447 startZoomThread(fTimeGraphCombo.getTimeGraphViewer().getTime0(), fTimeGraphCombo.getTimeGraphViewer().getTime1());\r
448\r
449 if (selectedThread > 0) {\r
450 for (Object element : fTimeGraphCombo.getTimeGraphViewer().getExpandedElements()) {\r
451 if (element instanceof ControlFlowEntry) {\r
452 ControlFlowEntry entry = (ControlFlowEntry) element;\r
453 if (entry.getThreadId() == selectedThread) {\r
454 fTimeGraphCombo.setSelection(entry);\r
7264b6f2 455 break;\r
0137b624
PT
456 }\r
457 }\r
458 }\r
459 }\r
49ffadb7
PT
460 }\r
461 });\r
462 }\r
463\r
464 @TmfSignalHandler\r
465 public void synchToRange(final TmfRangeSynchSignal signal) {\r
466 if (signal.getSource() == this) {\r
467 return;\r
468 }\r
469 final long startTime = signal.getCurrentRange().getStartTime().normalize(0, -9).getValue();\r
470 final long endTime = signal.getCurrentRange().getEndTime().normalize(0, -9).getValue();\r
471 final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
472 Display.getDefault().asyncExec(new Runnable() {\r
473 @Override\r
474 public void run() {\r
475 if (fTimeGraphCombo.isDisposed()) {\r
476 return;\r
477 }\r
478 fTimeGraphCombo.getTimeGraphViewer().setStartFinishTime(startTime, endTime);\r
3ac6ad1a
BH
479 fTimeGraphCombo.getTimeGraphViewer().setSelectedTime(time, false);\r
480 startZoomThread(startTime, endTime);\r
49ffadb7
PT
481 }\r
482 });\r
04835162
PT
483 }\r
484\r
b987050f
PT
485 @TmfSignalHandler\r
486 public void stateSystemBuildCompleted (final TmfStateSystemBuildCompleted signal) {\r
487 final TmfExperiment<?> selectedExperiment = fSelectedExperiment;\r
488 if (selectedExperiment == null) {\r
489 return;\r
490 }\r
491 for (ITmfTrace<?> trace : selectedExperiment.getTraces()) {\r
492 if (trace == signal.getTrace() && trace instanceof CtfKernelTrace) {\r
493 final Thread thread = new Thread("ControlFlowView build") { //$NON-NLS-1$\r
494 @Override\r
495 public void run() {\r
496 // rebuild the model\r
497 selectExperiment(selectedExperiment);\r
498 }\r
499 };\r
500 thread.start();\r
501 }\r
502 }\r
503 }\r
504\r
49ffadb7
PT
505 // ------------------------------------------------------------------------\r
506 // Internal\r
507 // ------------------------------------------------------------------------\r
508\r
04835162
PT
509 @SuppressWarnings("unchecked")\r
510 private void selectExperiment(TmfExperiment<?> experiment) {\r
511 fStartTime = Long.MAX_VALUE;\r
512 fEndTime = Long.MIN_VALUE;\r
513 fSelectedExperiment = (TmfExperiment<ITmfEvent>) experiment;\r
15c04058 514 ArrayList<ControlFlowEntry> rootList = new ArrayList<ControlFlowEntry>();\r
04835162
PT
515 for (ITmfTrace<?> trace : experiment.getTraces()) {\r
516 if (trace instanceof CtfKernelTrace) {\r
15c04058 517 ArrayList<ControlFlowEntry> entryList = new ArrayList<ControlFlowEntry>();\r
04835162
PT
518 CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace;\r
519 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
04835162 520 long start = ssq.getStartTime();\r
b987050f 521 long end = ssq.getCurrentEndTime() + 1;\r
04835162
PT
522 fStartTime = Math.min(fStartTime, start);\r
523 fEndTime = Math.max(fEndTime, end);\r
524 List<Integer> threadQuarks = ssq.getQuarks(Attributes.THREADS, "*"); //$NON-NLS-1$\r
525 for (int threadQuark : threadQuarks) {\r
526 String threadName = ssq.getAttributeName(threadQuark);\r
527 int threadId = -1;\r
528 try {\r
529 threadId = Integer.parseInt(threadName);\r
530 } catch (NumberFormatException e1) {\r
531 continue;\r
532 }\r
49ffadb7
PT
533 if (threadId == 0) { // ignore the swapper thread\r
534 continue;\r
535 }\r
04835162
PT
536 int execNameQuark = -1;\r
537 try {\r
538 try {\r
539 execNameQuark = ssq.getQuarkRelative(threadQuark, Attributes.EXEC_NAME);\r
540 } catch (AttributeNotFoundException e) {\r
541 continue;\r
542 }\r
543 int ppidQuark = ssq.getQuarkRelative(threadQuark, Attributes.PPID);\r
b987050f 544 List<ITmfStateInterval> execNameIntervals = ssq.queryHistoryRange(execNameQuark, start, end - 1);\r
49ffadb7 545 long birthTime = -1;\r
04835162
PT
546 for (ITmfStateInterval execNameInterval : execNameIntervals) {\r
547 if (!execNameInterval.getStateValue().isNull() && execNameInterval.getStateValue().getType() == 1) {\r
548 String execName = execNameInterval.getStateValue().unboxStr();\r
549 long startTime = execNameInterval.getStartTime();\r
49ffadb7
PT
550 long endTime = execNameInterval.getEndTime() + 1;\r
551 if (birthTime == -1) {\r
552 birthTime = startTime;\r
553 }\r
04835162
PT
554 int ppid = -1;\r
555 if (ppidQuark != -1) {\r
556 ITmfStateInterval ppidInterval = ssq.querySingleState(startTime, ppidQuark);\r
557 ppid = ppidInterval.getStateValue().unboxInt();\r
558 }\r
49ffadb7 559 ControlFlowEntry entry = new ControlFlowEntry(threadQuark, ctfKernelTrace, execName, threadId, ppid, birthTime, startTime, endTime);\r
8d8cb868 560 entryList.add(entry);\r
49ffadb7
PT
561 entry.addEvent(new TimeEvent(entry, startTime, endTime - startTime));\r
562 } else {\r
563 birthTime = -1;\r
04835162
PT
564 }\r
565 }\r
566 } catch (AttributeNotFoundException e) {\r
567 e.printStackTrace();\r
568 } catch (TimeRangeException e) {\r
569 e.printStackTrace();\r
570 } catch (StateValueTypeException e) {\r
571 e.printStackTrace();\r
572 }\r
573 }\r
15c04058 574 buildTree(entryList, rootList);\r
04835162 575 }\r
15c04058
PT
576 Collections.sort(rootList, fControlFlowEntryComparator);\r
577 fEntryList = rootList;\r
3ac6ad1a 578 refresh(INITIAL_WINDOW_OFFSET);\r
15c04058
PT
579 }\r
580 for (ControlFlowEntry entry : rootList) {\r
581 buildStatusEvents(entry);\r
49ffadb7
PT
582 }\r
583 }\r
584\r
15c04058 585 private void buildTree(ArrayList<ControlFlowEntry> entryList, ArrayList<ControlFlowEntry> rootList) {\r
8d8cb868 586 for (ControlFlowEntry entry : entryList) {\r
49ffadb7 587 boolean root = true;\r
3d90c4ff 588 if (entry.getParentThreadId() > 0) {\r
8d8cb868 589 for (ControlFlowEntry parent : entryList) {\r
3d90c4ff 590 if (parent.getThreadId() == entry.getParentThreadId() &&\r
49ffadb7
PT
591 entry.getStartTime() >= parent.getStartTime() &&\r
592 entry.getStartTime() <= parent.getEndTime()) {\r
593 parent.addChild(entry);\r
594 root = false;\r
595 break;\r
596 }\r
597 }\r
598 }\r
599 if (root) {\r
600 rootList.add(entry);\r
601 }\r
04835162 602 }\r
49ffadb7
PT
603 }\r
604\r
605 private void buildStatusEvents(ControlFlowEntry entry) {\r
606 IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
607 long start = ssq.getStartTime();\r
b987050f 608 long end = ssq.getCurrentEndTime() + 1;\r
49ffadb7 609 long resolution = Math.max(1, (end - start) / fDisplayWidth);\r
0137b624 610 List<ITimeEvent> eventList = getEventList(entry, entry.getStartTime(), entry.getEndTime(), resolution, new NullProgressMonitor());\r
49ffadb7
PT
611 entry.setEventList(eventList);\r
612 redraw();\r
613 for (ITimeGraphEntry child : entry.getChildren()) {\r
614 buildStatusEvents((ControlFlowEntry) child);\r
615 }\r
616 }\r
617\r
0137b624 618 private List<ITimeEvent> getEventList(ControlFlowEntry entry, long startTime, long endTime, long resolution, IProgressMonitor monitor) {\r
49ffadb7
PT
619 startTime = Math.max(startTime, entry.getStartTime());\r
620 endTime = Math.min(endTime, entry.getEndTime());\r
621 if (endTime <= startTime) {\r
622 return null;\r
623 }\r
624 IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
625 List<ITimeEvent> eventList = null;\r
626 try {\r
627 int statusQuark = ssq.getQuarkRelative(entry.getThreadQuark(), Attributes.STATUS);\r
628 List<ITmfStateInterval> statusIntervals = ssq.queryHistoryRange(statusQuark, startTime, endTime - 1, resolution);\r
629 eventList = new ArrayList<ITimeEvent>(statusIntervals.size());\r
630 long lastEndTime = -1;\r
631 for (ITmfStateInterval statusInterval : statusIntervals) {\r
0137b624
PT
632 if (monitor.isCanceled()) {\r
633 return null;\r
634 }\r
49ffadb7
PT
635 long time = statusInterval.getStartTime();\r
636 long duration = statusInterval.getEndTime() - time + 1;\r
637 int status = -1;\r
638 try {\r
639 status = statusInterval.getStateValue().unboxInt();\r
640 } catch (StateValueTypeException e) {\r
641 e.printStackTrace();\r
642 }\r
643 if (lastEndTime != time && lastEndTime != -1) {\r
644 eventList.add(new ControlFlowEvent(entry, lastEndTime, time - lastEndTime, 0));\r
645 }\r
646 eventList.add(new ControlFlowEvent(entry, time, duration, status));\r
647 lastEndTime = time + duration;\r
648 }\r
649 } catch (AttributeNotFoundException e) {\r
650 e.printStackTrace();\r
651 } catch (TimeRangeException e) {\r
652 e.printStackTrace();\r
653 }\r
654 return eventList;\r
04835162
PT
655 }\r
656\r
3ac6ad1a 657 private void refresh(final long windowRange) {\r
04835162
PT
658 Display.getDefault().asyncExec(new Runnable() {\r
659 @Override\r
660 public void run() {\r
661 if (fTimeGraphCombo.isDisposed()) {\r
662 return;\r
663 }\r
664 ITimeGraphEntry[] entries = fEntryList.toArray(new ITimeGraphEntry[0]);\r
2c33fc31 665 Arrays.sort(entries, fControlFlowEntryComparator);\r
04835162
PT
666 fTimeGraphCombo.setInput(entries);\r
667 fTimeGraphCombo.getTimeGraphViewer().setTimeBounds(fStartTime, fEndTime);\r
0137b624 668\r
3ac6ad1a
BH
669 long endTime = fStartTime + windowRange;\r
670\r
671 if (fEndTime < endTime) {\r
672 endTime = fEndTime;\r
673 }\r
674 fTimeGraphCombo.getTimeGraphViewer().setStartFinishTime(fStartTime, endTime);\r
49ffadb7
PT
675 for (TreeColumn column : fTimeGraphCombo.getTreeViewer().getTree().getColumns()) {\r
676 column.pack();\r
677 }\r
3ac6ad1a
BH
678\r
679 startZoomThread(fStartTime, endTime);\r
49ffadb7
PT
680 }\r
681 });\r
682 }\r
683\r
684 private void redraw() {\r
685 Display.getDefault().asyncExec(new Runnable() {\r
686 @Override\r
687 public void run() {\r
688 if (fTimeGraphCombo.isDisposed()) {\r
689 return;\r
690 }\r
691 fTimeGraphCombo.redraw();\r
692 fTimeGraphCombo.update();\r
04835162
PT
693 }\r
694 });\r
695 }\r
696\r
3ac6ad1a
BH
697 private void startZoomThread(long startTime, long endTime) {\r
698 if (fZoomThread != null) {\r
699 fZoomThread.cancel();\r
700 }\r
701 fZoomThread = new ZoomThread(startTime, endTime);\r
702 fZoomThread.start();\r
703 }\r
0137b624 704\r
49ffadb7
PT
705 private void makeActions() {\r
706 fPreviousResourceAction = fTimeGraphCombo.getTimeGraphViewer().getPreviousItemAction();\r
707 fPreviousResourceAction.setText(Messages.ControlFlowView_previousProcessActionNameText);\r
708 fPreviousResourceAction.setToolTipText(Messages.ControlFlowView_previousProcessActionToolTipText);\r
709 fNextResourceAction = fTimeGraphCombo.getTimeGraphViewer().getNextItemAction();\r
710 fNextResourceAction.setText(Messages.ControlFlowView_nextProcessActionNameText);\r
711 fNextResourceAction.setToolTipText(Messages.ControlFlowView_nextProcessActionToolTipText);\r
712 }\r
0137b624 713\r
49ffadb7
PT
714 private void contributeToActionBars() {\r
715 IActionBars bars = getViewSite().getActionBars();\r
716 fillLocalToolBar(bars.getToolBarManager());\r
717 }\r
718\r
719 private void fillLocalToolBar(IToolBarManager manager) {\r
720 manager.add(fTimeGraphCombo.getTimeGraphViewer().getShowLegendAction());\r
721 manager.add(new Separator());\r
722 manager.add(fTimeGraphCombo.getTimeGraphViewer().getResetScaleAction());\r
723 manager.add(fTimeGraphCombo.getTimeGraphViewer().getPreviousEventAction());\r
724 manager.add(fTimeGraphCombo.getTimeGraphViewer().getNextEventAction());\r
725 manager.add(fPreviousResourceAction);\r
726 manager.add(fNextResourceAction);\r
727 manager.add(fTimeGraphCombo.getTimeGraphViewer().getZoomInAction());\r
728 manager.add(fTimeGraphCombo.getTimeGraphViewer().getZoomOutAction());\r
729 manager.add(new Separator());\r
730 }\r
04835162 731}\r
This page took 0.063483 seconds and 5 git commands to generate.