1 /*******************************************************************************
2 * Copyright (c) 2009 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Yann N. Dauphin (dhaemon@gmail.com) - Implementation
11 * Francois Chouinard (fchouinard@gmail.com) - Initial API
12 *******************************************************************************/
14 package org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.statistics
;
16 import java
.text
.DecimalFormat
;
17 import java
.util
.Arrays
;
18 import java
.util
.Collections
;
19 import java
.util
.HashSet
;
20 import java
.util
.Iterator
;
21 import java
.util
.LinkedList
;
24 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
25 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
26 import org
.eclipse
.jface
.viewers
.TreeViewer
;
27 import org
.eclipse
.jface
.viewers
.TreeViewerColumn
;
28 import org
.eclipse
.jface
.viewers
.Viewer
;
29 import org
.eclipse
.jface
.viewers
.ViewerComparator
;
30 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.control
.LttngCoreProviderFactory
;
31 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.event
.LttngEvent
;
32 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.model
.LTTngTreeNode
;
33 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.request
.ILttngSyntEventRequest
;
34 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.state
.evProcessor
.AbsEventToHandlerResolver
;
35 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.state
.experiment
.StateManagerFactory
;
36 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.TraceDebug
;
37 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.model
.trange
.ItemContainer
;
38 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.viewers
.timeAnalysis
.model
.ITmfTimeAnalysisEntry
;
39 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.common
.AbsTimeUpdateView
;
40 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.common
.ParamsUpdater
;
41 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.statistics
.evProcessor
.StatsTimeCountHandlerFactory
;
42 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.statistics
.model
.KernelStatisticsData
;
43 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.statistics
.model
.StatisticsTreeNode
;
44 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.views
.statistics
.model
.StatisticsTreeRootFactory
;
45 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
46 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfTimeRange
;
47 import org
.eclipse
.linuxtools
.tmf
.core
.experiment
.TmfExperiment
;
48 import org
.eclipse
.linuxtools
.tmf
.core
.request
.ITmfDataRequest
.ExecutionType
;
49 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfExperimentRangeUpdatedSignal
;
50 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfExperimentSelectedSignal
;
51 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalHandler
;
52 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfTrace
;
53 import org
.eclipse
.swt
.SWT
;
54 import org
.eclipse
.swt
.events
.SelectionAdapter
;
55 import org
.eclipse
.swt
.events
.SelectionEvent
;
56 import org
.eclipse
.swt
.graphics
.Color
;
57 import org
.eclipse
.swt
.graphics
.Cursor
;
58 import org
.eclipse
.swt
.graphics
.Image
;
59 import org
.eclipse
.swt
.layout
.FillLayout
;
60 import org
.eclipse
.swt
.widgets
.Composite
;
61 import org
.eclipse
.swt
.widgets
.Display
;
62 import org
.eclipse
.swt
.widgets
.Event
;
63 import org
.eclipse
.swt
.widgets
.Listener
;
64 import org
.eclipse
.ui
.ISharedImages
;
65 import org
.eclipse
.ui
.PlatformUI
;
68 * <b><u>StatisticsView</u></b>
70 * The Statistics View displays statistics for traces.
72 * It is implemented according to the MVC pattern. - The model is a
73 * StatisticsTreeNode built by the State Manager. - The view is built with a
74 * TreeViewer. - The controller that keeps model and view synchronised is an
75 * observer of the model.
77 public class StatisticsView
extends AbsTimeUpdateView
{
78 public static final String ID
= "org.eclipse.linuxtools.lttng.ui.views.statistics"; //$NON-NLS-1$
79 private TreeViewer treeViewer
;
82 private final String LEVEL_COLUMN
= Messages
.StatisticsView_LevelColumn
;
83 private final String EVENTS_COUNT_COLUMN
= Messages
.StatisticsView_NbEventsColumn
;
84 private final String CPU_TIME_COLUMN
= Messages
.StatisticsView_CPUTimeColumn
;
85 private final String CUMULATIVE_CPU_TIME_COLUMN
= Messages
.StatisticsView_CumCPUTimeColumn
;
86 private final String ELAPSED_TIME_COLUMN
= Messages
.StatisticsView_ElapsedTimeColumn
;
88 // Table column tooltips
89 private final String LEVEL_COLUMN_TIP
= Messages
.StatisticsView_LevelColumnTip
;
90 private final String EVENTS_COUNT_COLUMN_TIP
= Messages
.StatisticsView_NbEventsTip
;
91 private final String CPU_TIME_COLUMN_TIP
= Messages
.StatisticsView_CPUTimeTip
;
92 private final String CUMULATIVE_CPU_TIME_COLUMN_TIP
= Messages
.StatisticsView_CumCPUTimeTip
;
93 private final String ELAPSED_TIME_COLUMN_TIP
= Messages
.StatisticsView_ElapsedTimeTip
;
95 // Level for which statistics should not be displayed.
96 private Set
<Integer
> folderLevels
= new HashSet
<Integer
>(Arrays
97 .asList(new Integer
[] { KernelStatisticsData
.HEADER_CPUS_INT
,
98 KernelStatisticsData
.HEADER_EVENT_TYPES_INT
,
99 KernelStatisticsData
.HEADER_FUNCTIONS_INT
,
100 KernelStatisticsData
.HEADER_MODES_INT
,
101 KernelStatisticsData
.HEADER_PROCESSES_INT
,
102 KernelStatisticsData
.HEADER_SUBMODES_INT
}));
104 // Levels for which sub-levels should not contain time-related statistics.
105 private Set
<Integer
> levelsWithEmptyTime
= new HashSet
<Integer
>(Arrays
106 .asList(new Integer
[] { KernelStatisticsData
.HEADER_EVENT_TYPES_INT
}));
108 private DecimalFormat decimalFormat
= new DecimalFormat("0.#########"); //$NON-NLS-1$
110 private Cursor fwaitCursor
= null;
112 private static final Long STATS_INPUT_CHANGED_REFRESH
= 5000L;
114 // Used to draw bar charts in columns.
115 private interface ColumnPercentageProvider
{
116 public double getPercentage(StatisticsTreeNode node
);
119 private boolean fStatisticsUpdateBusy
= false;
120 private boolean fStatisticsUpdatePending
= false;
121 private TmfTimeRange fStatisticsUpdateRange
= null;
122 private final Object fStatisticsUpdateSyncObj
= new Object();
123 private boolean fClearData
= true;
124 // Flag to force request the data from trace
125 private boolean fRequestData
= false;
128 * Contains all the information necessary to build a column of the table.
130 private static class ColumnData
{
131 // Name of the column.
132 public final String header
;
133 // Width of the column.
134 public final int width
;
135 // Alignment of the column.
136 public final int alignment
;
137 // Tooltip of the column.
138 public final String tooltip
;
139 // Adapts a StatisticsTreeNode into the content of it's corresponding
140 // cell for that column.
141 public final ColumnLabelProvider labelProvider
;
142 // Used to sort elements of this column. Can be null.
143 public final ViewerComparator comparator
;
144 // Used to draw bar charts in this column. Can be null.
145 public final ColumnPercentageProvider percentageProvider
;
147 public ColumnData(String h
, int w
, int a
, String t
,
148 ColumnLabelProvider l
, ViewerComparator c
,
149 ColumnPercentageProvider p
) {
156 percentageProvider
= p
;
160 // List that will be used to create the table.
161 private ColumnData
[] columnDataList
= new ColumnData
[] {
162 new ColumnData(LEVEL_COLUMN
, 200, SWT
.LEFT
, LEVEL_COLUMN_TIP
,
163 new ColumnLabelProvider() {
165 public String
getText(Object element
) {
166 StatisticsTreeNode node
= (StatisticsTreeNode
) element
;
167 if (folderLevels
.contains(node
.getKey())) {
168 return (KernelStatisticsData
.getCategoryFromId(node
.getKey().intValue()));
170 return node
.getName();
175 public Image
getImage(Object element
) {
176 StatisticsTreeNode node
= (StatisticsTreeNode
) element
;
177 if (folderLevels
.contains(node
.getKey())) {
178 return PlatformUI
.getWorkbench()
179 .getSharedImages().getImage(
180 ISharedImages
.IMG_OBJ_FOLDER
);
182 return PlatformUI
.getWorkbench()
183 .getSharedImages().getImage(
184 ISharedImages
.IMG_OBJ_ELEMENT
);
187 }, new ViewerComparator() {
189 public int compare(Viewer viewer
, Object e1
, Object e2
) {
190 StatisticsTreeNode n1
= (StatisticsTreeNode
) e1
;
191 StatisticsTreeNode n2
= (StatisticsTreeNode
) e2
;
193 // return n1.getKey().compareTo(n2.getKey());
194 return n1
.compareTo(n2
);
197 new ColumnData(EVENTS_COUNT_COLUMN
, 125, SWT
.LEFT
,
198 EVENTS_COUNT_COLUMN_TIP
, new ColumnLabelProvider() {
200 public String
getText(Object element
) {
201 StatisticsTreeNode node
= (StatisticsTreeNode
) element
;
202 if (!folderLevels
.contains(node
.getKey())) {
203 return Long
.toString(node
.getValue().nbEvents
);
205 return ""; //$NON-NLS-1$
208 }, new ViewerComparator() {
210 public int compare(Viewer viewer
, Object e1
, Object e2
) {
211 StatisticsTreeNode n1
= (StatisticsTreeNode
) e1
;
212 StatisticsTreeNode n2
= (StatisticsTreeNode
) e2
;
214 return (int) (n1
.getValue().nbEvents
- n2
215 .getValue().nbEvents
);
217 }, new ColumnPercentageProvider() {
219 public double getPercentage(StatisticsTreeNode node
) {
220 StatisticsTreeNode parent
= node
;
222 parent
= parent
.getParent();
223 } while (parent
!= null
224 && parent
.getValue().nbEvents
== 0);
226 if (parent
== null) {
229 return (double) node
.getValue().nbEvents
230 / parent
.getValue().nbEvents
;
234 new ColumnData(CPU_TIME_COLUMN
, 125, SWT
.LEFT
, CPU_TIME_COLUMN_TIP
,
235 new ColumnLabelProvider() {
237 public String
getText(Object element
) {
238 StatisticsTreeNode node
= (StatisticsTreeNode
) element
;
240 if (folderLevels
.contains(node
.getKey())) {
241 return ""; //$NON-NLS-1$
242 } else if (node
.getParent() != null
243 && levelsWithEmptyTime
.contains(node
244 .getParent().getKey())) {
245 return ""; //$NON-NLS-1$
248 .format(node
.getValue().cpuTime
253 new ColumnData(CUMULATIVE_CPU_TIME_COLUMN
, 155, SWT
.LEFT
,
254 CUMULATIVE_CPU_TIME_COLUMN_TIP
, new ColumnLabelProvider() {
256 public String
getText(Object element
) {
257 StatisticsTreeNode node
= (StatisticsTreeNode
) element
;
258 if (folderLevels
.contains(node
.getKey())) {
259 return ""; //$NON-NLS-1$
260 } else if (node
.getParent() != null
261 && levelsWithEmptyTime
.contains(node
262 .getParent().getKey())) {
263 return ""; //$NON-NLS-1$
266 .format(node
.getValue().cumulativeCpuTime
271 new ColumnData(ELAPSED_TIME_COLUMN
, 100, SWT
.LEFT
,
272 ELAPSED_TIME_COLUMN_TIP
, new ColumnLabelProvider() {
274 public String
getText(Object element
) {
275 StatisticsTreeNode node
= (StatisticsTreeNode
) element
;
276 if (folderLevels
.contains(node
.getKey())) {
277 return ""; //$NON-NLS-1$
278 } else if (node
.getParent() != null
279 && levelsWithEmptyTime
.contains(node
280 .getParent().getKey())) {
281 return ""; //$NON-NLS-1$
284 .format(node
.getValue().elapsedTime
291 * Adapter TreeViewers can use to interact with StatisticsTreeNode objects.
293 * @see org.eclipse.jface.viewers.ITreeContentProvider
295 private static class TreeContentProvider
implements ITreeContentProvider
{
300 * org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang
304 public Object
[] getChildren(Object parentElement
) {
305 return ((StatisticsTreeNode
) parentElement
).getChildren().toArray();
312 * org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang
316 public Object
getParent(Object element
) {
317 return ((StatisticsTreeNode
) element
).getParent();
324 * org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang
328 public boolean hasChildren(Object element
) {
329 return ((StatisticsTreeNode
) element
).hasChildren();
336 * org.eclipse.jface.viewers.IStructuredContentProvider#getElements(
340 public Object
[] getElements(Object inputElement
) {
341 return getChildren(inputElement
);
347 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
350 public void dispose() {
357 * org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse
358 * .jface.viewers.Viewer, java.lang.Object, java.lang.Object)
362 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
366 public StatisticsView(String viewName
) {
370 private static final String STATISTICS_VIEW
= "StatisticsView"; //$NON-NLS-1$
371 public StatisticsView() {
372 this(STATISTICS_VIEW
);
379 * org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets
383 public void createPartControl(Composite parent
) {
384 parent
.setLayout(new FillLayout());
386 treeViewer
= new TreeViewer(parent
, SWT
.BORDER
| SWT
.H_SCROLL
388 treeViewer
.setContentProvider(new TreeContentProvider());
389 treeViewer
.getTree().setHeaderVisible(true);
390 treeViewer
.setUseHashlookup(true);
392 for (final ColumnData columnData
: columnDataList
) {
393 final TreeViewerColumn treeColumn
= new TreeViewerColumn(
394 treeViewer
, columnData
.alignment
);
395 treeColumn
.getColumn().setText(columnData
.header
);
396 treeColumn
.getColumn().setWidth(columnData
.width
);
397 treeColumn
.getColumn().setToolTipText(columnData
.tooltip
);
398 if (columnData
.comparator
!= null) {
399 treeColumn
.getColumn().addSelectionListener(
400 new SelectionAdapter() {
402 public void widgetSelected(SelectionEvent e
) {
403 if (treeViewer
.getTree().getSortDirection() == SWT
.UP
404 || treeViewer
.getTree().getSortColumn() != treeColumn
407 .setComparator(columnData
.comparator
);
408 treeViewer
.getTree().setSortDirection(
412 .setComparator(new ViewerComparator() {
416 Object e1
, Object e2
) {
418 * columnData
.comparator
425 treeViewer
.getTree().setSortDirection(
428 treeViewer
.getTree().setSortColumn(
429 treeColumn
.getColumn());
433 treeColumn
.setLabelProvider(columnData
.labelProvider
);
436 // Handler that will draw the bar charts.
437 treeViewer
.getTree().addListener(SWT
.EraseItem
, new Listener() {
440 public void handleEvent(Event event
) {
441 if (columnDataList
[event
.index
].percentageProvider
!= null) {
442 StatisticsTreeNode node
= (StatisticsTreeNode
) event
.item
445 double percentage
= columnDataList
[event
.index
].percentageProvider
446 .getPercentage(node
);
447 if (percentage
== 0) {
451 if ((event
.detail
& SWT
.SELECTED
) > 0) {
452 Color oldForeground
= event
.gc
.getForeground();
453 event
.gc
.setForeground(event
.item
.getDisplay()
454 .getSystemColor(SWT
.COLOR_LIST_SELECTION
));
455 event
.gc
.fillRectangle(event
.x
, event
.y
, event
.width
,
457 event
.gc
.setForeground(oldForeground
);
458 event
.detail
&= ~SWT
.SELECTED
;
461 int barWidth
= (int) ((treeViewer
.getTree().getColumn(1)
462 .getWidth() - 8) * percentage
);
463 int oldAlpha
= event
.gc
.getAlpha();
464 Color oldForeground
= event
.gc
.getForeground();
465 Color oldBackground
= event
.gc
.getBackground();
466 event
.gc
.setAlpha(64);
467 event
.gc
.setForeground(event
.item
.getDisplay()
468 .getSystemColor(SWT
.COLOR_BLUE
));
469 event
.gc
.setBackground(event
.item
.getDisplay()
470 .getSystemColor(SWT
.COLOR_LIST_BACKGROUND
));
471 event
.gc
.fillGradientRectangle(event
.x
, event
.y
, barWidth
,
473 event
.gc
.drawRectangle(event
.x
, event
.y
, barWidth
,
475 event
.gc
.setForeground(oldForeground
);
476 event
.gc
.setBackground(oldBackground
);
477 event
.gc
.setAlpha(oldAlpha
);
478 event
.detail
&= ~SWT
.BACKGROUND
;
483 treeViewer
.setComparator(columnDataList
[0].comparator
);
484 treeViewer
.getTree().setSortColumn(treeViewer
.getTree().getColumn(0));
485 treeViewer
.getTree().setSortDirection(SWT
.DOWN
);
487 // Read current data if any available
488 TmfExperiment
<?
> experiment
= TmfExperiment
.getCurrentExperiment();
489 if (experiment
!= null) {
491 @SuppressWarnings({ "rawtypes", "unchecked" })
492 TmfExperimentSelectedSignal
<?
> signal
= new TmfExperimentSelectedSignal(this, experiment
);
494 experimentSelected(signal
);
497 TraceDebug
.debug("No selected experiment information available"); //$NON-NLS-1$
502 public void dispose() {
504 if (fwaitCursor
!= null) {
505 fwaitCursor
.dispose();
509 StatisticsTreeRootFactory
.removeAll();
515 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
518 public void setFocus() {
519 treeViewer
.getTree().setFocus();
525 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#getInputChangedRefresh()
528 protected Long
getInputChangedRefresh() {
529 return STATS_INPUT_CHANGED_REFRESH
;
536 public AbsEventToHandlerResolver
getEventProcessor() {
537 return StatsTimeCountHandlerFactory
.getInstance();
544 * org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#waitCursor
548 protected void waitCursor(final boolean waitInd
) {
549 if ((treeViewer
== null) || (treeViewer
.getTree().isDisposed())) {
553 Display display
= treeViewer
.getControl().getDisplay();
554 if (fwaitCursor
== null) {
555 fwaitCursor
= new Cursor(display
, SWT
.CURSOR_WAIT
);
558 // Perform the updates on the UI thread
559 display
.asyncExec(new Runnable() {
562 if ((treeViewer
!= null) && (!treeViewer
.getTree().isDisposed())) {
563 Cursor cursor
= null; /* indicates default */
565 cursor
= fwaitCursor
;
567 treeViewer
.getControl().setCursor(cursor
);
574 public void modelUpdatePrep(TmfTimeRange timeRange
, boolean clearAllData
) {
575 Object input
= treeViewer
.getInput();
576 if ((input
!= null) && (input
instanceof StatisticsTreeNode
) && (!treeViewer
.getTree().isDisposed())) {
578 ((StatisticsTreeNode
) input
).reset();
580 treeViewer
.getTree().getDisplay().asyncExec(new Runnable() {
584 if (!treeViewer
.getTree().isDisposed())
585 treeViewer
.refresh();
592 public void modelInputChanged(ILttngSyntEventRequest request
, boolean complete
) {
593 // Ignore update if disposed
594 if (treeViewer
.getTree().isDisposed()) return;
596 if(TraceDebug
.isSV() && complete
) {
599 TmfExperiment
<?
> experiment
= TmfExperiment
.getCurrentExperiment();
600 if(experiment
!= null) {
601 StatisticsTreeNode node
= StatisticsTreeRootFactory
.getStatTreeRoot(experiment
.getName());
602 printRecursively(node
);
607 treeViewer
.getTree().getDisplay().asyncExec(new Runnable() {
611 if (!treeViewer
.getTree().isDisposed())
612 treeViewer
.refresh();
617 synchronized (fStatisticsUpdateSyncObj
) {
618 fStatisticsUpdateBusy
= false;
619 if (fStatisticsUpdatePending
) {
620 fStatisticsUpdatePending
= false;
621 requestData(TmfExperiment
.getCurrentExperiment(), fStatisticsUpdateRange
, false);
628 private static int level
= 0;
629 private void printRecursively(StatisticsTreeNode node
) {
630 StringBuffer tab
= new StringBuffer(""); //$NON-NLS-1$
631 for (int i
= 0; i
< level
; i
++) {
632 tab
.append("\t"); //$NON-NLS-1$
635 TraceDebug
.traceSV(tab
+ node
.getContent());
636 if (node
.hasChildren()) {
637 LinkedList
<StatisticsTreeNode
> childreen
= (LinkedList
<StatisticsTreeNode
>)node
.getChildren();
638 Collections
.sort(childreen
);
640 for (Iterator
<StatisticsTreeNode
> iterator
= childreen
.iterator(); iterator
.hasNext();) {
641 StatisticsTreeNode statisticsTreeNode
= (StatisticsTreeNode
) iterator
.next();
642 printRecursively(statisticsTreeNode
);
651 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
653 * (org.eclipse.linuxtools.lttng.request.ILttngSyntEventRequest)
656 public void modelIncomplete(ILttngSyntEventRequest request
) {
657 // Do not remove incomplete statistics, they can be completed upon next selection
664 public void experimentSelected(TmfExperimentSelectedSignal
<?
extends ITmfEvent
> signal
) {
665 if (signal
!= null) {
666 TmfExperiment
<?
> experiment
= signal
.getExperiment();
667 String experimentName
= experiment
.getName();
669 if (StatisticsTreeRootFactory
.containsTreeRoot(experimentName
)) {
670 // The experiment root is already present
671 StatisticsTreeNode experimentTreeNode
= StatisticsTreeRootFactory
.getStatTreeRoot(experimentName
);
673 @SuppressWarnings("rawtypes")
674 ITmfTrace
[] traces
= experiment
.getTraces();
676 LTTngTreeNode expNode
= StateManagerFactory
.getExperimentManager().getSelectedExperiment();
678 // check if there is partial data loaded in the experiment
679 int numTraces
= experiment
.getTraces().length
;
680 int numNodeTraces
= experimentTreeNode
.getNbChildren();
682 if (numTraces
== numNodeTraces
) {
684 // Detect if the experiment contains the same traces as when
685 // previously selected
686 for (int i
= 0; i
< numTraces
; i
++) {
687 String traceName
= traces
[i
].getName();
688 LTTngTreeNode child
= expNode
.getChildByName(traceName
);
689 if ((child
== null) || (!experimentTreeNode
.containsChild(child
.getId().intValue()))) {
696 treeViewer
.setInput(experimentTreeNode
);
697 synchronized (fStatisticsUpdateSyncObj
) {
698 fStatisticsUpdateBusy
= false;
699 fStatisticsUpdatePending
= false;
701 // request in case current data is incomplete
702 requestData(experiment
, experiment
.getTimeRange(), false);
708 StatisticsTreeNode treeModelRoot
= StatisticsTreeRootFactory
.getStatTreeRoot(experiment
.getName());
710 // if the model has contents, clear to start over
711 if (treeModelRoot
.hasChildren()) {
712 treeModelRoot
.reset();
715 // set input to a clean data model
716 treeViewer
.setInput(treeModelRoot
);
718 synchronized (fStatisticsUpdateSyncObj
) {
719 fStatisticsUpdateBusy
= false;
720 fStatisticsUpdatePending
= false;
723 // if the data is not available or has changed, reload it
726 requestData(experiment
, experiment
.getTimeRange(), fClearData
);
727 fRequestData
= false;
735 @SuppressWarnings("unchecked")
737 public void experimentRangeUpdated(TmfExperimentRangeUpdatedSignal signal
) {
738 TmfExperiment
<LttngEvent
> experiment
= (TmfExperiment
<LttngEvent
>) signal
.getExperiment();
740 if (! experiment
.equals(TmfExperiment
.getCurrentExperiment())) {
744 requestData(experiment
, signal
.getRange(), fClearData
);
751 private void requestData(TmfExperiment
<?
> experiment
, TmfTimeRange range
, boolean clearingData
) {
752 if (experiment
!= null) {
753 synchronized (fStatisticsUpdateSyncObj
) {
754 if (fStatisticsUpdateBusy
) {
755 fStatisticsUpdatePending
= true;
756 fStatisticsUpdateRange
= range
;
759 fStatisticsUpdateBusy
= true;
764 for (StatisticsTreeNode node
: ((StatisticsTreeNode
) treeViewer
.getInput()).getChildren()) {
765 index
+= (int) node
.getValue().nbEvents
;
768 // send the initial request, to start filling up model
769 eventRequest(index
, range
, clearingData
, ExecutionType
.BACKGROUND
);
771 TraceDebug
.debug("No selected experiment information available"); //$NON-NLS-1$
779 * org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#displayModel
780 * (org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.
781 * ITmfTimeAnalysisEntry[], long, long, boolean, long, long,
785 protected void displayModel(ITmfTimeAnalysisEntry
[] items
, long startBoundTime
, long endBoundTime
,
786 boolean updateTimeBounds
, long startVisibleWindow
, long endVisibleWindow
, Object source
) {
787 // No applicable to statistics view
793 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
797 protected ParamsUpdater
getParamsUpdater() {
798 // Not applicable to statistics view
803 protected ItemContainer
<?
> getItemContainer() {
804 // Not applicable to statistics view
810 * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#getProviderId()
813 protected int getProviderId() {
814 return LttngCoreProviderFactory
.STATISTICS_LTTNG_SYTH_EVENT_PROVIDER
;