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
17import java.util.HashMap;\r
18import java.util.List;\r
19import java.util.Map;\r
20\r
49ffadb7
PT
21import org.eclipse.jface.action.Action;\r
22import org.eclipse.jface.action.IToolBarManager;\r
23import org.eclipse.jface.action.Separator;\r
04835162
PT
24import org.eclipse.jface.viewers.ILabelProviderListener;\r
25import org.eclipse.jface.viewers.ITableLabelProvider;\r
26import org.eclipse.jface.viewers.ITreeContentProvider;\r
27import org.eclipse.jface.viewers.Viewer;\r
28import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Messages;\r
29import org.eclipse.linuxtools.lttng2.kernel.core.trace.Attributes;\r
30import org.eclipse.linuxtools.lttng2.kernel.core.trace.CtfKernelTrace;\r
49ffadb7 31import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfTimestamp;\r
04835162 32import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;\r
49ffadb7
PT
33import org.eclipse.linuxtools.tmf.core.event.TmfTimeRange;\r
34import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;\r
04835162
PT
35import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException;\r
36import org.eclipse.linuxtools.tmf.core.exceptions.StateValueTypeException;\r
37import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException;\r
04835162
PT
38import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval;\r
39import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal;\r
49ffadb7 40import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal;\r
04835162 41import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;\r
49ffadb7 42import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal;\r
04835162 43import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier;\r
3ac6ad1a 44import org.eclipse.linuxtools.tmf.core.statevalue.ITmfStateValue;\r
04835162 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
49ffadb7 51import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.StateItem;\r
04835162 52import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphCombo;\r
49ffadb7 53import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider;\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
49ffadb7 65import org.eclipse.swt.graphics.RGB;\r
04835162
PT
66import org.eclipse.swt.widgets.Composite;\r
67import org.eclipse.swt.widgets.Display;\r
49ffadb7
PT
68import org.eclipse.swt.widgets.TreeColumn;\r
69import org.eclipse.ui.IActionBars;\r
04835162
PT
70\r
71public class ControlFlowView extends TmfView {\r
72\r
73 // ------------------------------------------------------------------------\r
74 // Constants\r
75 // ------------------------------------------------------------------------\r
76\r
77 /**\r
78 * View ID.\r
79 */\r
80 public static final String ID = "org.eclipse.linuxtools.lttng2.kernel.ui.views.controlflow"; //$NON-NLS-1$\r
81\r
3ac6ad1a
BH
82 /**\r
83 * Initial time range\r
84 */\r
85 private static final long INITIAL_WINDOW_OFFSET = (1L * 100 * 1000 * 1000); // .1sec\r
86 \r
49ffadb7
PT
87 private static final String PROCESS_COLUMN = Messages.ControlFlowView_processColumn;\r
88 private static final String TID_COLUMN = Messages.ControlFlowView_tidColumn;\r
89 private static final String PPID_COLUMN = Messages.ControlFlowView_ppidColumn;\r
90 private static final String BIRTH_TIME_COLUMN = Messages.ControlFlowView_birthTimeColumn;\r
91 private static final String TRACE_COLUMN = Messages.ControlFlowView_traceColumn;\r
04835162
PT
92\r
93 private final String[] COLUMN_NAMES = new String[] {\r
94 PROCESS_COLUMN,\r
95 TID_COLUMN,\r
04835162 96 PPID_COLUMN,\r
49ffadb7 97 BIRTH_TIME_COLUMN,\r
04835162
PT
98 TRACE_COLUMN\r
99 };\r
100\r
101 // ------------------------------------------------------------------------\r
102 // Fields\r
103 // ------------------------------------------------------------------------\r
104\r
105 // The timegraph combo\r
106 private TimeGraphCombo fTimeGraphCombo;\r
107\r
108 // The selected experiment\r
109 private TmfExperiment<ITmfEvent> fSelectedExperiment;\r
110\r
111 // The timegraph entry list\r
49ffadb7 112 private ArrayList<ControlFlowEntry> fEntryList;\r
04835162
PT
113\r
114 // The start time\r
115 private long fStartTime;\r
116\r
117 // The end time\r
118 private long fEndTime;\r
119\r
49ffadb7
PT
120 // The display width\r
121 private int fDisplayWidth;\r
122\r
123 // The zoom thread\r
124 private ZoomThread fZoomThread;\r
125 \r
126 // The next resource action\r
127 private Action fNextResourceAction;\r
128 \r
129 // The previous resource action\r
130 private Action fPreviousResourceAction;\r
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
168 \r
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
PT
202 } else if (columnIndex == 2) {\r
203 if (entry.getPPID() > 0) {\r
04835162
PT
204 return Integer.toString(entry.getPPID());\r
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
213 \r
214 }\r
215\r
49ffadb7 216 private class ZoomThread extends Thread {\r
3ac6ad1a
BH
217 private long fZoomStartTime;\r
218 private long fZoomEndTime;\r
49ffadb7
PT
219 private long fResolution;\r
220 private boolean fCancelled = false;\r
221\r
222 public ZoomThread(long startTime, long endTime) {\r
223 super("ControlFlowView zoom"); //$NON-NLS-1$\r
3ac6ad1a
BH
224 fZoomStartTime = startTime;\r
225 fZoomEndTime = endTime;\r
226 fResolution = Math.max(1, (fZoomEndTime - fZoomStartTime) / fDisplayWidth);\r
49ffadb7
PT
227 }\r
228\r
229 @Override\r
230 public void run() {\r
231 if (fEntryList == null) {\r
232 return;\r
233 }\r
234 for (ControlFlowEntry entry : fEntryList) {\r
235 if (fCancelled) {\r
236 return;\r
237 }\r
238 zoom(entry);\r
239 }\r
240 redraw();\r
241 }\r
242\r
243 private void zoom(ControlFlowEntry entry) {\r
3ac6ad1a 244 List<ITimeEvent> zoomedEventList = getEventList(entry, fZoomStartTime, fZoomEndTime, fResolution);\r
49ffadb7
PT
245 entry.setZoomedEventList(zoomedEventList);\r
246 for (ControlFlowEntry child : entry.getChildren()) {\r
247 if (fCancelled) {\r
248 return;\r
249 }\r
250 zoom(child);\r
251 }\r
252 }\r
253\r
254 public void cancel() {\r
255 fCancelled = true;\r
256 }\r
257 }\r
258\r
04835162
PT
259 // ------------------------------------------------------------------------\r
260 // Constructors\r
261 // ------------------------------------------------------------------------\r
262\r
263 public ControlFlowView() {\r
264 super(ID);\r
49ffadb7 265 fDisplayWidth = Display.getDefault().getBounds().width;\r
04835162
PT
266 }\r
267\r
268 // ------------------------------------------------------------------------\r
269 // ViewPart\r
270 // ------------------------------------------------------------------------\r
271\r
272 /* (non-Javadoc)\r
273 * @see org.eclipse.linuxtools.tmf.ui.views.TmfView#createPartControl(org.eclipse.swt.widgets.Composite)\r
274 */\r
275 @Override\r
276 public void createPartControl(Composite parent) {\r
277 fTimeGraphCombo = new TimeGraphCombo(parent, SWT.NONE);\r
278\r
279 fTimeGraphCombo.setTreeContentProvider(new TreeContentProvider());\r
280\r
281 fTimeGraphCombo.setTreeLabelProvider(new TreeLabelProvider());\r
282\r
49ffadb7
PT
283 fTimeGraphCombo.setTimeGraphProvider(new TimeGraphPresentationProvider() {\r
284 private static final String UNKNOWN = "UNKNOWN"; //$NON-NLS-1$\r
285 private static final String WAIT = "WAIT"; //$NON-NLS-1$\r
286 private static final String USERMODE = "USERMODE"; //$NON-NLS-1$\r
287 private static final String SYSCALL = "SYSCALL"; //$NON-NLS-1$\r
288 private static final String INTERRUPTED = "INTERRUPTED"; //$NON-NLS-1$\r
289\r
290 @Override \r
291 public String getStateTypeName() {\r
292 return Messages.ControlFlowView_stateTypeName;\r
04835162
PT
293 }\r
294 \r
295 @Override\r
49ffadb7
PT
296 public StateItem[] getStateTable() {\r
297 return new StateItem[] {\r
298 new StateItem(new RGB(100, 100, 100), UNKNOWN),\r
299 new StateItem(new RGB(150, 150, 0), WAIT),\r
300 new StateItem(new RGB(0, 200, 0), USERMODE),\r
301 new StateItem(new RGB(0, 0, 200), SYSCALL),\r
302 new StateItem(new RGB(200, 100, 100), INTERRUPTED)\r
303 };\r
04835162 304 }\r
49ffadb7 305\r
04835162 306 @Override\r
49ffadb7
PT
307 public int getEventTableIndex(ITimeEvent event) {\r
308 if (event instanceof ControlFlowEvent) {\r
309 int status = ((ControlFlowEvent) event).getStatus();\r
310 if (status == Attributes.STATUS_WAIT) {\r
311 return 1;\r
312 } else if (status == Attributes.STATUS_RUN_USERMODE) {\r
313 return 2;\r
314 } else if (status == Attributes.STATUS_RUN_SYSCALL) {\r
315 return 3;\r
316 } else if (status == Attributes.STATUS_INTERRUPTED) {\r
317 return 4;\r
318 }\r
319 }\r
320 return 0;\r
04835162 321 }\r
49ffadb7 322\r
04835162 323 @Override\r
49ffadb7
PT
324 public String getEventName(ITimeEvent event) {\r
325 if (event instanceof ControlFlowEvent) {\r
326 int status = ((ControlFlowEvent) event).getStatus();\r
327 if (status == Attributes.STATUS_WAIT) {\r
328 return WAIT;\r
329 } else if (status == Attributes.STATUS_RUN_USERMODE) {\r
330 return USERMODE;\r
331 } else if (status == Attributes.STATUS_RUN_SYSCALL) {\r
332 return SYSCALL;\r
333 } else if (status == Attributes.STATUS_INTERRUPTED) {\r
334 return INTERRUPTED;\r
335 }\r
336 }\r
337 return UNKNOWN;\r
04835162 338 }\r
4867b9bd
MK
339 \r
340 @Override\r
49ffadb7 341 public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event) {\r
3ac6ad1a
BH
342 Map<String, String> retMap = new HashMap<String, String>();\r
343 if (event instanceof ControlFlowEvent) {\r
344 int status = ((ControlFlowEvent) event).getStatus();\r
345 if (status == Attributes.STATUS_RUN_SYSCALL) {\r
346 ControlFlowEntry entry = (ControlFlowEntry) event.getEntry();\r
347 IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
348 try {\r
349 int syscallQuark = ssq.getQuarkRelative(entry.getThreadQuark(), Attributes.SYSTEM_CALL);\r
350 ITmfStateInterval value = ssq.querySingleState(event.getTime(), syscallQuark);\r
351 if (!value.getStateValue().isNull()) {\r
352 ITmfStateValue state = value.getStateValue();\r
353 retMap.put(Messages.ControlFlowView_attributeSyscallName, state.toString());\r
354 }\r
355 \r
356 } catch (AttributeNotFoundException e) {\r
357 e.printStackTrace();\r
358 } catch (TimeRangeException e) {\r
359 e.printStackTrace();\r
360 }\r
361// List<ITmfStateInterval> statusIntervals = ssq.queryHistoryRange(statusQuark, startTime, endTime - 1, resolution);\r
362 } \r
363 }\r
364 \r
365 return retMap;\r
4867b9bd 366 }\r
04835162
PT
367 });\r
368\r
369 fTimeGraphCombo.setTreeColumns(COLUMN_NAMES);\r
370\r
371 fTimeGraphCombo.getTimeGraphViewer().addRangeListener(new ITimeGraphRangeListener() {\r
372 @Override\r
373 public void timeRangeUpdated(TimeGraphRangeUpdateEvent event) {\r
49ffadb7
PT
374 final long startTime = event.getStartTime();\r
375 final long endTime = event.getEndTime();\r
376 TmfTimeRange range = new TmfTimeRange(new CtfTmfTimestamp(startTime), new CtfTmfTimestamp(endTime));\r
377 TmfTimestamp time = new CtfTmfTimestamp(fTimeGraphCombo.getTimeGraphViewer().getSelectedTime());\r
378 broadcast(new TmfRangeSynchSignal(ControlFlowView.this, range, time));\r
379 if (fZoomThread != null) {\r
380 fZoomThread.cancel();\r
381 }\r
3ac6ad1a 382 startZoomThread(startTime, endTime);\r
04835162
PT
383 }\r
384 });\r
385\r
386 fTimeGraphCombo.getTimeGraphViewer().addTimeListener(new ITimeGraphTimeListener() {\r
387 @Override\r
388 public void timeSelected(TimeGraphTimeEvent event) {\r
389 long time = event.getTime();\r
49ffadb7 390 broadcast(new TmfTimeSynchSignal(ControlFlowView.this, new CtfTmfTimestamp(time)));\r
04835162
PT
391 }\r
392 });\r
393\r
394 fTimeGraphCombo.addSelectionListener(new ITimeGraphSelectionListener() {\r
395 @Override\r
396 public void selectionChanged(TimeGraphSelectionEvent event) {\r
49ffadb7 397 //ITimeGraphEntry selection = event.getSelection();\r
04835162
PT
398 }\r
399 });\r
400\r
49ffadb7
PT
401 fTimeGraphCombo.getTimeGraphViewer().setTimeCalendarFormat(true);\r
402\r
403 final Thread thread = new Thread("ControlFlowView build") { //$NON-NLS-1$\r
04835162
PT
404 @Override\r
405 public void run() {\r
406 if (TmfExperiment.getCurrentExperiment() != null) {\r
407 selectExperiment(TmfExperiment.getCurrentExperiment());\r
408 }\r
409 }\r
410 };\r
411 thread.start();\r
49ffadb7
PT
412 \r
413 // View Action Handling\r
414 makeActions();\r
415 contributeToActionBars();\r
04835162
PT
416 }\r
417\r
418 /* (non-Javadoc)\r
419 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()\r
420 */\r
421 @Override\r
422 public void setFocus() {\r
423 fTimeGraphCombo.setFocus();\r
424 }\r
425\r
426 // ------------------------------------------------------------------------\r
427 // Signal handlers\r
428 // ------------------------------------------------------------------------\r
429\r
430 @TmfSignalHandler\r
431 public void experimentSelected(final TmfExperimentSelectedSignal<? extends ITmfEvent> signal) {\r
432 if (signal.getExperiment().equals(fSelectedExperiment)) {\r
433 return;\r
434 }\r
435\r
49ffadb7 436 final Thread thread = new Thread("ControlFlowView build") { //$NON-NLS-1$\r
04835162
PT
437 @Override\r
438 public void run() {\r
439 selectExperiment(signal.getExperiment());\r
440 }};\r
49ffadb7
PT
441 thread.start();\r
442 }\r
443\r
444 @TmfSignalHandler\r
445 public void synchToTime(final TmfTimeSynchSignal signal) {\r
446 if (signal.getSource() == this) {\r
447 return;\r
448 }\r
449 final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
450 Display.getDefault().asyncExec(new Runnable() {\r
451 @Override\r
452 public void run() {\r
453 if (fTimeGraphCombo.isDisposed()) {\r
454 return;\r
455 }\r
3ac6ad1a 456 fTimeGraphCombo.getTimeGraphViewer().setSelectedTime(time, true);\r
49ffadb7
PT
457 }\r
458 });\r
459 }\r
460\r
461 @TmfSignalHandler\r
462 public void synchToRange(final TmfRangeSynchSignal signal) {\r
463 if (signal.getSource() == this) {\r
464 return;\r
465 }\r
466 final long startTime = signal.getCurrentRange().getStartTime().normalize(0, -9).getValue();\r
467 final long endTime = signal.getCurrentRange().getEndTime().normalize(0, -9).getValue();\r
468 final long time = signal.getCurrentTime().normalize(0, -9).getValue();\r
469 Display.getDefault().asyncExec(new Runnable() {\r
470 @Override\r
471 public void run() {\r
472 if (fTimeGraphCombo.isDisposed()) {\r
473 return;\r
474 }\r
475 fTimeGraphCombo.getTimeGraphViewer().setStartFinishTime(startTime, endTime);\r
3ac6ad1a
BH
476 fTimeGraphCombo.getTimeGraphViewer().setSelectedTime(time, false);\r
477 startZoomThread(startTime, endTime);\r
49ffadb7
PT
478 }\r
479 });\r
04835162
PT
480 }\r
481\r
49ffadb7
PT
482 // ------------------------------------------------------------------------\r
483 // Internal\r
484 // ------------------------------------------------------------------------\r
485\r
04835162
PT
486 @SuppressWarnings("unchecked")\r
487 private void selectExperiment(TmfExperiment<?> experiment) {\r
488 fStartTime = Long.MAX_VALUE;\r
489 fEndTime = Long.MIN_VALUE;\r
490 fSelectedExperiment = (TmfExperiment<ITmfEvent>) experiment;\r
49ffadb7 491 fEntryList = new ArrayList<ControlFlowEntry>();\r
04835162
PT
492 for (ITmfTrace<?> trace : experiment.getTraces()) {\r
493 if (trace instanceof CtfKernelTrace) {\r
494 CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace;\r
495 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r
04835162
PT
496 long start = ssq.getStartTime();\r
497 long end = ssq.getCurrentEndTime();\r
498 fStartTime = Math.min(fStartTime, start);\r
499 fEndTime = Math.max(fEndTime, end);\r
500 List<Integer> threadQuarks = ssq.getQuarks(Attributes.THREADS, "*"); //$NON-NLS-1$\r
501 for (int threadQuark : threadQuarks) {\r
502 String threadName = ssq.getAttributeName(threadQuark);\r
503 int threadId = -1;\r
504 try {\r
505 threadId = Integer.parseInt(threadName);\r
506 } catch (NumberFormatException e1) {\r
507 continue;\r
508 }\r
49ffadb7
PT
509 if (threadId == 0) { // ignore the swapper thread\r
510 continue;\r
511 }\r
04835162
PT
512 int execNameQuark = -1;\r
513 try {\r
514 try {\r
515 execNameQuark = ssq.getQuarkRelative(threadQuark, Attributes.EXEC_NAME);\r
516 } catch (AttributeNotFoundException e) {\r
517 continue;\r
518 }\r
519 int ppidQuark = ssq.getQuarkRelative(threadQuark, Attributes.PPID);\r
520 List<ITmfStateInterval> execNameIntervals = ssq.queryHistoryRange(execNameQuark, start, end);\r
49ffadb7 521 long birthTime = -1;\r
04835162
PT
522 for (ITmfStateInterval execNameInterval : execNameIntervals) {\r
523 if (!execNameInterval.getStateValue().isNull() && execNameInterval.getStateValue().getType() == 1) {\r
524 String execName = execNameInterval.getStateValue().unboxStr();\r
525 long startTime = execNameInterval.getStartTime();\r
49ffadb7
PT
526 long endTime = execNameInterval.getEndTime() + 1;\r
527 if (birthTime == -1) {\r
528 birthTime = startTime;\r
529 }\r
04835162
PT
530 int ppid = -1;\r
531 if (ppidQuark != -1) {\r
532 ITmfStateInterval ppidInterval = ssq.querySingleState(startTime, ppidQuark);\r
533 ppid = ppidInterval.getStateValue().unboxInt();\r
534 }\r
49ffadb7
PT
535 ControlFlowEntry entry = new ControlFlowEntry(threadQuark, ctfKernelTrace, execName, threadId, ppid, birthTime, startTime, endTime);\r
536 fEntryList.add(entry);\r
537 entry.addEvent(new TimeEvent(entry, startTime, endTime - startTime));\r
538 } else {\r
539 birthTime = -1;\r
04835162
PT
540 }\r
541 }\r
542 } catch (AttributeNotFoundException e) {\r
543 e.printStackTrace();\r
544 } catch (TimeRangeException e) {\r
545 e.printStackTrace();\r
546 } catch (StateValueTypeException e) {\r
547 e.printStackTrace();\r
548 }\r
549 }\r
550 }\r
49ffadb7 551 buildTree();\r
3ac6ad1a 552 refresh(INITIAL_WINDOW_OFFSET);\r
49ffadb7
PT
553 ControlFlowEntry[] entries = fEntryList.toArray(new ControlFlowEntry[0]);\r
554 Arrays.sort(entries);\r
555 for (ControlFlowEntry entry : entries) {\r
556 buildStatusEvents(entry);\r
557 }\r
558 }\r
559 }\r
560\r
561 private void buildTree() {\r
562 ArrayList<ControlFlowEntry> rootList = new ArrayList<ControlFlowEntry>();\r
563 for (ControlFlowEntry entry : fEntryList) {\r
564 boolean root = true;\r
565 if (entry.getPPID() > 0) {\r
566 for (ControlFlowEntry parent : fEntryList) {\r
567 if (parent.getThreadId() == entry.getPPID() &&\r
568 entry.getStartTime() >= parent.getStartTime() &&\r
569 entry.getStartTime() <= parent.getEndTime()) {\r
570 parent.addChild(entry);\r
571 root = false;\r
572 break;\r
573 }\r
574 }\r
575 }\r
576 if (root) {\r
577 rootList.add(entry);\r
578 }\r
04835162 579 }\r
49ffadb7
PT
580 fEntryList = rootList;\r
581 }\r
582\r
583 private void buildStatusEvents(ControlFlowEntry entry) {\r
584 IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
585 long start = ssq.getStartTime();\r
586 long end = ssq.getCurrentEndTime();\r
587 long resolution = Math.max(1, (end - start) / fDisplayWidth);\r
588 List<ITimeEvent> eventList = getEventList(entry, entry.getStartTime(), entry.getEndTime(), resolution);\r
589 entry.setEventList(eventList);\r
590 redraw();\r
591 for (ITimeGraphEntry child : entry.getChildren()) {\r
592 buildStatusEvents((ControlFlowEntry) child);\r
593 }\r
594 }\r
595\r
596 private List<ITimeEvent> getEventList(ControlFlowEntry entry, long startTime, long endTime, long resolution) {\r
597 startTime = Math.max(startTime, entry.getStartTime());\r
598 endTime = Math.min(endTime, entry.getEndTime());\r
599 if (endTime <= startTime) {\r
600 return null;\r
601 }\r
602 IStateSystemQuerier ssq = entry.getTrace().getStateSystem();\r
603 List<ITimeEvent> eventList = null;\r
604 try {\r
605 int statusQuark = ssq.getQuarkRelative(entry.getThreadQuark(), Attributes.STATUS);\r
606 List<ITmfStateInterval> statusIntervals = ssq.queryHistoryRange(statusQuark, startTime, endTime - 1, resolution);\r
607 eventList = new ArrayList<ITimeEvent>(statusIntervals.size());\r
608 long lastEndTime = -1;\r
609 for (ITmfStateInterval statusInterval : statusIntervals) {\r
610 long time = statusInterval.getStartTime();\r
611 long duration = statusInterval.getEndTime() - time + 1;\r
612 int status = -1;\r
613 try {\r
614 status = statusInterval.getStateValue().unboxInt();\r
615 } catch (StateValueTypeException e) {\r
616 e.printStackTrace();\r
617 }\r
618 if (lastEndTime != time && lastEndTime != -1) {\r
619 eventList.add(new ControlFlowEvent(entry, lastEndTime, time - lastEndTime, 0));\r
620 }\r
621 eventList.add(new ControlFlowEvent(entry, time, duration, status));\r
622 lastEndTime = time + duration;\r
623 }\r
624 } catch (AttributeNotFoundException e) {\r
625 e.printStackTrace();\r
626 } catch (TimeRangeException e) {\r
627 e.printStackTrace();\r
628 }\r
629 return eventList;\r
04835162
PT
630 }\r
631\r
3ac6ad1a 632 private void refresh(final long windowRange) {\r
04835162
PT
633 Display.getDefault().asyncExec(new Runnable() {\r
634 @Override\r
635 public void run() {\r
636 if (fTimeGraphCombo.isDisposed()) {\r
637 return;\r
638 }\r
639 ITimeGraphEntry[] entries = fEntryList.toArray(new ITimeGraphEntry[0]);\r
640 Arrays.sort(entries);\r
641 fTimeGraphCombo.setInput(entries);\r
642 fTimeGraphCombo.getTimeGraphViewer().setTimeBounds(fStartTime, fEndTime);\r
3ac6ad1a
BH
643 \r
644 long endTime = fStartTime + windowRange;\r
645\r
646 if (fEndTime < endTime) {\r
647 endTime = fEndTime;\r
648 }\r
649 fTimeGraphCombo.getTimeGraphViewer().setStartFinishTime(fStartTime, endTime);\r
49ffadb7
PT
650 for (TreeColumn column : fTimeGraphCombo.getTreeViewer().getTree().getColumns()) {\r
651 column.pack();\r
652 }\r
3ac6ad1a
BH
653\r
654 startZoomThread(fStartTime, endTime);\r
49ffadb7
PT
655 }\r
656 });\r
657 }\r
658\r
659 private void redraw() {\r
660 Display.getDefault().asyncExec(new Runnable() {\r
661 @Override\r
662 public void run() {\r
663 if (fTimeGraphCombo.isDisposed()) {\r
664 return;\r
665 }\r
666 fTimeGraphCombo.redraw();\r
667 fTimeGraphCombo.update();\r
04835162
PT
668 }\r
669 });\r
670 }\r
671\r
3ac6ad1a
BH
672 private void startZoomThread(long startTime, long endTime) {\r
673 if (fZoomThread != null) {\r
674 fZoomThread.cancel();\r
675 }\r
676 fZoomThread = new ZoomThread(startTime, endTime);\r
677 fZoomThread.start();\r
678 }\r
679 \r
49ffadb7
PT
680 private void makeActions() {\r
681 fPreviousResourceAction = fTimeGraphCombo.getTimeGraphViewer().getPreviousItemAction();\r
682 fPreviousResourceAction.setText(Messages.ControlFlowView_previousProcessActionNameText);\r
683 fPreviousResourceAction.setToolTipText(Messages.ControlFlowView_previousProcessActionToolTipText);\r
684 fNextResourceAction = fTimeGraphCombo.getTimeGraphViewer().getNextItemAction();\r
685 fNextResourceAction.setText(Messages.ControlFlowView_nextProcessActionNameText);\r
686 fNextResourceAction.setToolTipText(Messages.ControlFlowView_nextProcessActionToolTipText);\r
687 }\r
688 \r
689 private void contributeToActionBars() {\r
690 IActionBars bars = getViewSite().getActionBars();\r
691 fillLocalToolBar(bars.getToolBarManager());\r
692 }\r
693\r
694 private void fillLocalToolBar(IToolBarManager manager) {\r
695 manager.add(fTimeGraphCombo.getTimeGraphViewer().getShowLegendAction());\r
696 manager.add(new Separator());\r
697 manager.add(fTimeGraphCombo.getTimeGraphViewer().getResetScaleAction());\r
698 manager.add(fTimeGraphCombo.getTimeGraphViewer().getPreviousEventAction());\r
699 manager.add(fTimeGraphCombo.getTimeGraphViewer().getNextEventAction());\r
700 manager.add(fPreviousResourceAction);\r
701 manager.add(fNextResourceAction);\r
702 manager.add(fTimeGraphCombo.getTimeGraphViewer().getZoomInAction());\r
703 manager.add(fTimeGraphCombo.getTimeGraphViewer().getZoomOutAction());\r
704 manager.add(new Separator());\r
705 }\r
04835162 706}\r
This page took 0.056244 seconds and 5 git commands to generate.