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