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
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
21import org.eclipse.jface.action.Action;\r
22import org.eclipse.jface.action.IToolBarManager;\r
23import org.eclipse.jface.action.Separator;\r
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
31import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfTimestamp;\r
32import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;\r
33import org.eclipse.linuxtools.tmf.core.event.TmfTimeRange;\r
34import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;\r
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
38import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval;\r
39import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal;\r
40import org.eclipse.linuxtools.tmf.core.signal.TmfRangeSynchSignal;\r
41import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;\r
42import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal;\r
43import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier;\r
44import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;\r
45import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;\r
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.StateItem;\r
51import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphCombo;\r
52import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphPresentationProvider;\r
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
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
62import org.eclipse.swt.SWT;\r
63import org.eclipse.swt.graphics.Image;\r
64import org.eclipse.swt.graphics.RGB;\r
65import org.eclipse.swt.widgets.Composite;\r
66import org.eclipse.swt.widgets.Display;\r
67import org.eclipse.swt.widgets.TreeColumn;\r
68import org.eclipse.ui.IActionBars;\r
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
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
86\r
87 private final String[] COLUMN_NAMES = new String[] {\r
88 PROCESS_COLUMN,\r
89 TID_COLUMN,\r
90 PPID_COLUMN,\r
91 BIRTH_TIME_COLUMN,\r
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
106 private ArrayList<ControlFlowEntry> fEntryList;\r
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
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
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
196 } else if (columnIndex == 2) {\r
197 if (entry.getPPID() > 0) {\r
198 return Integer.toString(entry.getPPID());\r
199 }\r
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
204 }\r
205 return ""; //$NON-NLS-1$\r
206 }\r
207 \r
208 }\r
209\r
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
253 // ------------------------------------------------------------------------\r
254 // Constructors\r
255 // ------------------------------------------------------------------------\r
256\r
257 public ControlFlowView() {\r
258 super(ID);\r
259 fDisplayWidth = Display.getDefault().getBounds().width;\r
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
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
287 }\r
288 \r
289 @Override\r
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
298 }\r
299\r
300 @Override\r
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
315 }\r
316\r
317 @Override\r
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
332 }\r
333 \r
334 @Override\r
335 public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event) {\r
336 return new HashMap<String, String>();\r
337 }\r
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
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
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
362 broadcast(new TmfTimeSynchSignal(ControlFlowView.this, new CtfTmfTimestamp(time)));\r
363 }\r
364 });\r
365\r
366 fTimeGraphCombo.addSelectionListener(new ITimeGraphSelectionListener() {\r
367 @Override\r
368 public void selectionChanged(TimeGraphSelectionEvent event) {\r
369 //ITimeGraphEntry selection = event.getSelection();\r
370 }\r
371 });\r
372\r
373 fTimeGraphCombo.getTimeGraphViewer().setTimeCalendarFormat(true);\r
374\r
375 final Thread thread = new Thread("ControlFlowView build") { //$NON-NLS-1$\r
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
384 \r
385 // View Action Handling\r
386 makeActions();\r
387 contributeToActionBars();\r
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
408 final Thread thread = new Thread("ControlFlowView build") { //$NON-NLS-1$\r
409 @Override\r
410 public void run() {\r
411 selectExperiment(signal.getExperiment());\r
412 }};\r
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
451 }\r
452\r
453 // ------------------------------------------------------------------------\r
454 // Internal\r
455 // ------------------------------------------------------------------------\r
456\r
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
462 fEntryList = new ArrayList<ControlFlowEntry>();\r
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
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
480 if (threadId == 0) { // ignore the swapper thread\r
481 continue;\r
482 }\r
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
492 long birthTime = -1;\r
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
497 long endTime = execNameInterval.getEndTime() + 1;\r
498 if (birthTime == -1) {\r
499 birthTime = startTime;\r
500 }\r
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
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
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
522 buildTree();\r
523 refresh();\r
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
550 }\r
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
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
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
631 }\r
632 });\r
633 }\r
634\r
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
661}\r
This page took 0.026071 seconds and 5 git commands to generate.