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