tmf: Rename the UI TmfStatistics class to TmfStatisticsValues
[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
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 39import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval;\r
ea279a69 40import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentDisposedSignal;\r
04835162 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
ea21cd65 107 private enum State { IDLE, BUSY, PENDING }\r
03bcc394 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
6256d8ad 117 private TmfExperiment fSelectedExperiment;\r
04835162
PT
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
ea279a69 281 entryList = (ArrayList<ControlFlowEntry>) fEntryList.clone();\r
c19a8781 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 413 @TmfSignalHandler\r
6256d8ad 414 public void experimentSelected(final TmfExperimentSelectedSignal signal) {\r
04835162
PT
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
ea279a69
FC
428 /**\r
429 * Experiment is disposed: clear the data structures and the view\r
430 *\r
431 * @param signal the signal received\r
432 */\r
433 @TmfSignalHandler\r
434 public void experimentDisposed(final TmfExperimentDisposedSignal signal) {\r
435 if (signal.getExperiment().equals(fSelectedExperiment)) {\r
436 fSelectedExperiment = null;\r
437 fStartTime = 0;\r
438 fEndTime = 0;\r
439 fZoomThread.cancel();\r
440 synchronized(fEntryListSyncObj) {\r
441 fEntryList.clear();\r
442 }\r
443 refresh(INITIAL_WINDOW_OFFSET);\r
444 }\r
445 }\r
446\r
27f3a03d
AM
447 /**\r
448 * Handler for the synch signal\r
449 *\r
450 * @param signal\r
451 * The signal that's received\r
452 */\r
49ffadb7
PT
453 @TmfSignalHandler\r
454 public void synchToTime(final TmfTimeSynchSignal signal) {\r
04aafb31 455 if (signal.getSource() == this || fSelectedExperiment == null || fSelectedExperiment.getTraces() == null) {\r
49ffadb7
PT
456 return;\r
457 }\r
458 final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
0137b624
PT
459\r
460 int thread = -1;\r
6256d8ad 461 for (ITmfTrace trace : fSelectedExperiment.getTraces()) {\r
0137b624
PT
462 if (thread > 0) {\r
463 break;\r
464 }\r
465 if (trace instanceof CtfKernelTrace) {\r
466 CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace;\r
467 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
468 if (time >= ssq.getStartTime() && time <= ssq.getCurrentEndTime()) {\r
469 List<Integer> currentThreadQuarks = ssq.getQuarks(Attributes.CPUS, "*", Attributes.CURRENT_THREAD); //$NON-NLS-1$\r
470 for (int currentThreadQuark : currentThreadQuarks) {\r
471 try {\r
472 ITmfStateInterval currentThreadInterval = ssq.querySingleState(time, currentThreadQuark);\r
473 int currentThread = currentThreadInterval.getStateValue().unboxInt();\r
474 if (currentThread > 0) {\r
475 int statusQuark = ssq.getQuarkAbsolute(Attributes.THREADS, Integer.toString(currentThread), Attributes.STATUS);\r
476 ITmfStateInterval statusInterval = ssq.querySingleState(time, statusQuark);\r
477 if (statusInterval.getStartTime() == time) {\r
478 thread = currentThread;\r
479 break;\r
480 }\r
481 }\r
482 } catch (AttributeNotFoundException e) {\r
483 e.printStackTrace();\r
484 } catch (TimeRangeException e) {\r
485 e.printStackTrace();\r
486 } catch (StateValueTypeException e) {\r
487 e.printStackTrace();\r
488 }\r
489 }\r
490 }\r
491 }\r
492 }\r
493 final int selectedThread = thread;\r
27f3a03d 494\r
49ffadb7
PT
495 Display.getDefault().asyncExec(new Runnable() {\r
496 @Override\r
497 public void run() {\r
498 if (fTimeGraphCombo.isDisposed()) {\r
499 return;\r
500 }\r
3ac6ad1a 501 fTimeGraphCombo.getTimeGraphViewer().setSelectedTime(time, true);\r
0137b624
PT
502 startZoomThread(fTimeGraphCombo.getTimeGraphViewer().getTime0(), fTimeGraphCombo.getTimeGraphViewer().getTime1());\r
503\r
504 if (selectedThread > 0) {\r
505 for (Object element : fTimeGraphCombo.getTimeGraphViewer().getExpandedElements()) {\r
506 if (element instanceof ControlFlowEntry) {\r
507 ControlFlowEntry entry = (ControlFlowEntry) element;\r
508 if (entry.getThreadId() == selectedThread) {\r
509 fTimeGraphCombo.setSelection(entry);\r
7264b6f2 510 break;\r
0137b624
PT
511 }\r
512 }\r
513 }\r
514 }\r
49ffadb7
PT
515 }\r
516 });\r
517 }\r
518\r
27f3a03d
AM
519 /**\r
520 * Handler for the range sync signal\r
521 *\r
522 * @param signal\r
523 * The signal that's received\r
524 */\r
49ffadb7
PT
525 @TmfSignalHandler\r
526 public void synchToRange(final TmfRangeSynchSignal signal) {\r
8a74a597 527 if (signal.getSource() == this || fSelectedExperiment == null) {\r
49ffadb7
PT
528 return;\r
529 }\r
530 final long startTime = signal.getCurrentRange().getStartTime().normalize(0, -9).getValue();\r
531 final long endTime = signal.getCurrentRange().getEndTime().normalize(0, -9).getValue();\r
532 final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
533 Display.getDefault().asyncExec(new Runnable() {\r
534 @Override\r
535 public void run() {\r
536 if (fTimeGraphCombo.isDisposed()) {\r
537 return;\r
538 }\r
539 fTimeGraphCombo.getTimeGraphViewer().setStartFinishTime(startTime, endTime);\r
3ac6ad1a
BH
540 fTimeGraphCombo.getTimeGraphViewer().setSelectedTime(time, false);\r
541 startZoomThread(startTime, endTime);\r
49ffadb7
PT
542 }\r
543 });\r
04835162
PT
544 }\r
545\r
27f3a03d
AM
546 /**\r
547 * Handler for the state system build completed signal\r
548 *\r
549 * @param signal\r
550 * The signal that's received\r
551 */\r
b987050f
PT
552 @TmfSignalHandler\r
553 public void stateSystemBuildCompleted (final TmfStateSystemBuildCompleted signal) {\r
6256d8ad 554 final TmfExperiment selectedExperiment = fSelectedExperiment;\r
04aafb31 555 if (selectedExperiment == null || selectedExperiment.getTraces() == null) {\r
b987050f
PT
556 return;\r
557 }\r
6256d8ad 558 for (ITmfTrace trace : selectedExperiment.getTraces()) {\r
b987050f
PT
559 if (trace == signal.getTrace() && trace instanceof CtfKernelTrace) {\r
560 final Thread thread = new Thread("ControlFlowView build") { //$NON-NLS-1$\r
561 @Override\r
562 public void run() {\r
563 // rebuild the model\r
564 selectExperiment(selectedExperiment);\r
565 }\r
566 };\r
567 thread.start();\r
568 }\r
569 }\r
570 }\r
571\r
49ffadb7
PT
572 // ------------------------------------------------------------------------\r
573 // Internal\r
574 // ------------------------------------------------------------------------\r
575\r
6256d8ad 576 private void selectExperiment(TmfExperiment experiment) {\r
04835162
PT
577 fStartTime = Long.MAX_VALUE;\r
578 fEndTime = Long.MIN_VALUE;\r
6256d8ad 579 fSelectedExperiment = experiment;\r
15c04058 580 ArrayList<ControlFlowEntry> rootList = new ArrayList<ControlFlowEntry>();\r
6256d8ad 581 for (ITmfTrace trace : experiment.getTraces()) {\r
04835162 582 if (trace instanceof CtfKernelTrace) {\r
15c04058 583 ArrayList<ControlFlowEntry> entryList = new ArrayList<ControlFlowEntry>();\r
04835162
PT
584 CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace;\r
585 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
04835162 586 long start = ssq.getStartTime();\r
b987050f 587 long end = ssq.getCurrentEndTime() + 1;\r
04835162
PT
588 fStartTime = Math.min(fStartTime, start);\r
589 fEndTime = Math.max(fEndTime, end);\r
590 List<Integer> threadQuarks = ssq.getQuarks(Attributes.THREADS, "*"); //$NON-NLS-1$\r
591 for (int threadQuark : threadQuarks) {\r
592 String threadName = ssq.getAttributeName(threadQuark);\r
593 int threadId = -1;\r
594 try {\r
595 threadId = Integer.parseInt(threadName);\r
596 } catch (NumberFormatException e1) {\r
597 continue;\r
598 }\r
49ffadb7
PT
599 if (threadId == 0) { // ignore the swapper thread\r
600 continue;\r
601 }\r
04835162
PT
602 int execNameQuark = -1;\r
603 try {\r
604 try {\r
605 execNameQuark = ssq.getQuarkRelative(threadQuark, Attributes.EXEC_NAME);\r
606 } catch (AttributeNotFoundException e) {\r
607 continue;\r
608 }\r
609 int ppidQuark = ssq.getQuarkRelative(threadQuark, Attributes.PPID);\r
b987050f 610 List<ITmfStateInterval> execNameIntervals = ssq.queryHistoryRange(execNameQuark, start, end - 1);\r
49ffadb7 611 long birthTime = -1;\r
04835162
PT
612 for (ITmfStateInterval execNameInterval : execNameIntervals) {\r
613 if (!execNameInterval.getStateValue().isNull() && execNameInterval.getStateValue().getType() == 1) {\r
614 String execName = execNameInterval.getStateValue().unboxStr();\r
615 long startTime = execNameInterval.getStartTime();\r
49ffadb7
PT
616 long endTime = execNameInterval.getEndTime() + 1;\r
617 if (birthTime == -1) {\r
618 birthTime = startTime;\r
619 }\r
04835162
PT
620 int ppid = -1;\r
621 if (ppidQuark != -1) {\r
622 ITmfStateInterval ppidInterval = ssq.querySingleState(startTime, ppidQuark);\r
623 ppid = ppidInterval.getStateValue().unboxInt();\r
624 }\r
49ffadb7 625 ControlFlowEntry entry = new ControlFlowEntry(threadQuark, ctfKernelTrace, execName, threadId, ppid, birthTime, startTime, endTime);\r
8d8cb868 626 entryList.add(entry);\r
49ffadb7
PT
627 entry.addEvent(new TimeEvent(entry, startTime, endTime - startTime));\r
628 } else {\r
629 birthTime = -1;\r
04835162
PT
630 }\r
631 }\r
632 } catch (AttributeNotFoundException e) {\r
633 e.printStackTrace();\r
634 } catch (TimeRangeException e) {\r
635 e.printStackTrace();\r
636 } catch (StateValueTypeException e) {\r
637 e.printStackTrace();\r
638 }\r
639 }\r
15c04058 640 buildTree(entryList, rootList);\r
04835162 641 }\r
15c04058 642 Collections.sort(rootList, fControlFlowEntryComparator);\r
c19a8781
PT
643 synchronized (fEntryListSyncObj) {\r
644 fEntryList = (ArrayList<ControlFlowEntry>) rootList.clone();\r
645 }\r
3ac6ad1a 646 refresh(INITIAL_WINDOW_OFFSET);\r
15c04058
PT
647 }\r
648 for (ControlFlowEntry entry : rootList) {\r
649 buildStatusEvents(entry);\r
49ffadb7
PT
650 }\r
651 }\r
652\r
0a78d11a
AM
653 private static void buildTree(ArrayList<ControlFlowEntry> entryList,\r
654 ArrayList<ControlFlowEntry> rootList) {\r
8d8cb868 655 for (ControlFlowEntry entry : entryList) {\r
49ffadb7 656 boolean root = true;\r
3d90c4ff 657 if (entry.getParentThreadId() > 0) {\r
8d8cb868 658 for (ControlFlowEntry parent : entryList) {\r
3d90c4ff 659 if (parent.getThreadId() == entry.getParentThreadId() &&\r
49ffadb7
PT
660 entry.getStartTime() >= parent.getStartTime() &&\r
661 entry.getStartTime() <= parent.getEndTime()) {\r
662 parent.addChild(entry);\r
663 root = false;\r
664 break;\r
665 }\r
666 }\r
667 }\r
668 if (root) {\r
669 rootList.add(entry);\r
670 }\r
04835162 671 }\r
49ffadb7
PT
672 }\r
673\r
674 private void buildStatusEvents(ControlFlowEntry entry) {\r
675 IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
676 long start = ssq.getStartTime();\r
b987050f 677 long end = ssq.getCurrentEndTime() + 1;\r
49ffadb7 678 long resolution = Math.max(1, (end - start) / fDisplayWidth);\r
0137b624 679 List<ITimeEvent> eventList = getEventList(entry, entry.getStartTime(), entry.getEndTime(), resolution, new NullProgressMonitor());\r
49ffadb7
PT
680 entry.setEventList(eventList);\r
681 redraw();\r
682 for (ITimeGraphEntry child : entry.getChildren()) {\r
683 buildStatusEvents((ControlFlowEntry) child);\r
684 }\r
685 }\r
686\r
0a78d11a
AM
687 private static List<ITimeEvent> getEventList(ControlFlowEntry entry,\r
688 long startTime, long endTime, long resolution,\r
689 IProgressMonitor monitor) {\r
49ffadb7
PT
690 startTime = Math.max(startTime, entry.getStartTime());\r
691 endTime = Math.min(endTime, entry.getEndTime());\r
692 if (endTime <= startTime) {\r
693 return null;\r
694 }\r
b5a8d0cc 695 IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
49ffadb7
PT
696 List<ITimeEvent> eventList = null;\r
697 try {\r
698 int statusQuark = ssq.getQuarkRelative(entry.getThreadQuark(), Attributes.STATUS);\r
03bcc394 699 List<ITmfStateInterval> statusIntervals = ssq.queryHistoryRange(statusQuark, startTime, endTime - 1, resolution, monitor);\r
49ffadb7
PT
700 eventList = new ArrayList<ITimeEvent>(statusIntervals.size());\r
701 long lastEndTime = -1;\r
702 for (ITmfStateInterval statusInterval : statusIntervals) {\r
0137b624
PT
703 if (monitor.isCanceled()) {\r
704 return null;\r
705 }\r
49ffadb7
PT
706 long time = statusInterval.getStartTime();\r
707 long duration = statusInterval.getEndTime() - time + 1;\r
708 int status = -1;\r
709 try {\r
710 status = statusInterval.getStateValue().unboxInt();\r
711 } catch (StateValueTypeException e) {\r
712 e.printStackTrace();\r
713 }\r
714 if (lastEndTime != time && lastEndTime != -1) {\r
715 eventList.add(new ControlFlowEvent(entry, lastEndTime, time - lastEndTime, 0));\r
716 }\r
717 eventList.add(new ControlFlowEvent(entry, time, duration, status));\r
718 lastEndTime = time + duration;\r
719 }\r
720 } catch (AttributeNotFoundException e) {\r
721 e.printStackTrace();\r
722 } catch (TimeRangeException e) {\r
723 e.printStackTrace();\r
724 }\r
725 return eventList;\r
04835162
PT
726 }\r
727\r
3ac6ad1a 728 private void refresh(final long windowRange) {\r
04835162
PT
729 Display.getDefault().asyncExec(new Runnable() {\r
730 @Override\r
731 public void run() {\r
732 if (fTimeGraphCombo.isDisposed()) {\r
733 return;\r
734 }\r
c19a8781
PT
735 ITimeGraphEntry[] entries = null;\r
736 synchronized (fEntryListSyncObj) {\r
737 entries = fEntryList.toArray(new ITimeGraphEntry[0]);\r
738 }\r
2c33fc31 739 Arrays.sort(entries, fControlFlowEntryComparator);\r
04835162
PT
740 fTimeGraphCombo.setInput(entries);\r
741 fTimeGraphCombo.getTimeGraphViewer().setTimeBounds(fStartTime, fEndTime);\r
0137b624 742\r
3ac6ad1a
BH
743 long endTime = fStartTime + windowRange;\r
744\r
745 if (fEndTime < endTime) {\r
746 endTime = fEndTime;\r
747 }\r
748 fTimeGraphCombo.getTimeGraphViewer().setStartFinishTime(fStartTime, endTime);\r
49ffadb7
PT
749 for (TreeColumn column : fTimeGraphCombo.getTreeViewer().getTree().getColumns()) {\r
750 column.pack();\r
751 }\r
3ac6ad1a
BH
752\r
753 startZoomThread(fStartTime, endTime);\r
49ffadb7
PT
754 }\r
755 });\r
756 }\r
757\r
758 private void redraw() {\r
03bcc394
PT
759 synchronized (fSyncObj) {\r
760 if (fRedrawState == State.IDLE) {\r
761 fRedrawState = State.BUSY;\r
762 } else {\r
763 fRedrawState = State.PENDING;\r
764 return;\r
765 }\r
766 }\r
49ffadb7
PT
767 Display.getDefault().asyncExec(new Runnable() {\r
768 @Override\r
769 public void run() {\r
770 if (fTimeGraphCombo.isDisposed()) {\r
771 return;\r
772 }\r
773 fTimeGraphCombo.redraw();\r
774 fTimeGraphCombo.update();\r
03bcc394
PT
775 synchronized (fSyncObj) {\r
776 if (fRedrawState == State.PENDING) {\r
777 fRedrawState = State.IDLE;\r
778 redraw();\r
779 } else {\r
780 fRedrawState = State.IDLE;\r
781 }\r
782 }\r
04835162
PT
783 }\r
784 });\r
785 }\r
786\r
3ac6ad1a
BH
787 private void startZoomThread(long startTime, long endTime) {\r
788 if (fZoomThread != null) {\r
789 fZoomThread.cancel();\r
790 }\r
791 fZoomThread = new ZoomThread(startTime, endTime);\r
792 fZoomThread.start();\r
793 }\r
0137b624 794\r
49ffadb7
PT
795 private void makeActions() {\r
796 fPreviousResourceAction = fTimeGraphCombo.getTimeGraphViewer().getPreviousItemAction();\r
797 fPreviousResourceAction.setText(Messages.ControlFlowView_previousProcessActionNameText);\r
798 fPreviousResourceAction.setToolTipText(Messages.ControlFlowView_previousProcessActionToolTipText);\r
799 fNextResourceAction = fTimeGraphCombo.getTimeGraphViewer().getNextItemAction();\r
800 fNextResourceAction.setText(Messages.ControlFlowView_nextProcessActionNameText);\r
801 fNextResourceAction.setToolTipText(Messages.ControlFlowView_nextProcessActionToolTipText);\r
802 }\r
0137b624 803\r
49ffadb7
PT
804 private void contributeToActionBars() {\r
805 IActionBars bars = getViewSite().getActionBars();\r
806 fillLocalToolBar(bars.getToolBarManager());\r
807 }\r
808\r
809 private void fillLocalToolBar(IToolBarManager manager) {\r
810 manager.add(fTimeGraphCombo.getTimeGraphViewer().getShowLegendAction());\r
811 manager.add(new Separator());\r
812 manager.add(fTimeGraphCombo.getTimeGraphViewer().getResetScaleAction());\r
813 manager.add(fTimeGraphCombo.getTimeGraphViewer().getPreviousEventAction());\r
814 manager.add(fTimeGraphCombo.getTimeGraphViewer().getNextEventAction());\r
815 manager.add(fPreviousResourceAction);\r
816 manager.add(fNextResourceAction);\r
817 manager.add(fTimeGraphCombo.getTimeGraphViewer().getZoomInAction());\r
818 manager.add(fTimeGraphCombo.getTimeGraphViewer().getZoomOutAction());\r
819 manager.add(new Separator());\r
820 }\r
04835162 821}\r
This page took 0.071037 seconds and 5 git commands to generate.