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