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