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