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