1 /*******************************************************************************
2 * Copyright (c) 2014, 2016 École Polytechnique de Montréal and others
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 * Geneviève Bastien - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.tracecompass
.internal
.analysis
.os
.linux
.ui
.views
.cpuusage
;
15 import static org
.eclipse
.tracecompass
.common
.core
.NonNullUtils
.checkNotNull
;
18 import java
.util
.TreeSet
;
20 import org
.eclipse
.jdt
.annotation
.NonNull
;
21 import org
.eclipse
.jdt
.annotation
.Nullable
;
22 import org
.eclipse
.jface
.viewers
.ISelection
;
23 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
24 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
25 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
26 import org
.eclipse
.swt
.events
.ControlAdapter
;
27 import org
.eclipse
.swt
.events
.ControlEvent
;
28 import org
.eclipse
.swt
.widgets
.Composite
;
29 import org
.eclipse
.tracecompass
.analysis
.os
.linux
.core
.signals
.TmfCpuSelectedSignal
;
30 import org
.eclipse
.tracecompass
.internal
.analysis
.os
.linux
.ui
.Activator
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalHandler
;
32 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceSelectedSignal
;
33 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
34 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceContext
;
35 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceManager
;
36 import org
.eclipse
.tracecompass
.tmf
.ui
.viewers
.TmfViewer
;
37 import org
.eclipse
.tracecompass
.tmf
.ui
.viewers
.xycharts
.TmfXYChartViewer
;
38 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.TmfChartView
;
40 import com
.google
.common
.base
.Predicates
;
41 import com
.google
.common
.collect
.Iterables
;
44 * CPU usage view. It contains 2 viewers: one tree viewer showing all the
45 * threads who were on the CPU in the time range, and one XY chart viewer
46 * plotting the total time spent on CPU and the time of the threads selected in
49 * @author Geneviève Bastien
51 public class CpuUsageView
extends TmfChartView
{
54 public static final @NonNull String ID
= "org.eclipse.tracecompass.analysis.os.linux.views.cpuusage"; //$NON-NLS-1$
56 /** ID of the selected thread in the map of data in {@link TmfTraceContext} */
57 public static final @NonNull String CPU_USAGE_SELECTED_THREAD
= ID
+ ".CPU_USAGE_SELECTED_TRHEAD"; //$NON-NLS-1$
59 /** ID of the followed CPU in the map data in {@link TmfTraceContext} */
60 public static final @NonNull String CPU_USAGE_FOLLOW_CPU
= ID
+ ".FOLLOW_CPU"; //$NON-NLS-1$
62 private @Nullable CpuUsageComposite fTreeViewer
= null;
63 private @Nullable CpuUsageXYViewer fXYViewer
= null;
68 public CpuUsageView() {
69 super(Messages
.CpuUsageView_Title
);
73 public void createPartControl(Composite parent
) {
74 super.createPartControl(parent
);
76 /* Initialize the viewers with the currently selected trace */
77 ITmfTrace trace
= TmfTraceManager
.getInstance().getActiveTrace();
79 TmfTraceSelectedSignal signal
= new TmfTraceSelectedSignal(this, trace
);
80 if (fTreeViewer
!= null) {
81 fTreeViewer
.traceSelected(signal
);
83 if (fXYViewer
!= null) {
84 fXYViewer
.traceSelected(signal
);
90 protected TmfXYChartViewer
createChartViewer(Composite parent
) {
91 CpuUsageXYViewer viewer
= new CpuUsageXYViewer(parent
);
92 viewer
.setSendTimeAlignSignals(true);
98 public TmfViewer
createLeftChildViewer(Composite parent
) {
99 final CpuUsageComposite viewer
= new CpuUsageComposite(parent
);
101 /* Add selection listener to tree viewer */
102 viewer
.addSelectionChangeListener(new ISelectionChangedListener() {
104 public void selectionChanged(SelectionChangedEvent event
) {
105 ISelection selection
= event
.getSelection();
106 if (selection
instanceof IStructuredSelection
) {
107 Object structSelection
= ((IStructuredSelection
) selection
).getFirstElement();
108 if (structSelection
instanceof CpuUsageEntry
) {
109 CpuUsageEntry entry
= (CpuUsageEntry
) structSelection
;
110 if (fTreeViewer
!= null) {
111 fTreeViewer
.setSelectedThread(entry
.getTid());
113 if (fXYViewer
!= null) {
114 fXYViewer
.setSelectedThread(Long
.valueOf(entry
.getTid()));
116 saveData(CPU_USAGE_SELECTED_THREAD
, entry
.getTid());
122 viewer
.getControl().addControlListener(new ControlAdapter() {
124 public void controlResized(ControlEvent e
) {
125 super.controlResized(e
);
129 fTreeViewer
= viewer
;
134 * Save a data in the data map of {@link TmfTraceContext}
136 private static void saveData(@NonNull String key
, Object data
) {
137 TmfTraceContext ctx
= TmfTraceManager
.getInstance().getCurrentTraceContext();
138 ctx
.setData(key
, checkNotNull(data
));
141 private static Object
getData(@NonNull String key
) {
142 TmfTraceContext ctx
= TmfTraceManager
.getInstance().getCurrentTraceContext();
143 return ctx
.getData(key
);
147 public void setFocus() {
148 if (fXYViewer
!= null) {
149 fXYViewer
.getControl().setFocus();
154 * Signal handler for when a cpu is selected
157 * the cpu being selected
161 public void cpuSelect(TmfCpuSelectedSignal signal
) {
162 final @Nullable CpuUsageXYViewer xyViewer
= fXYViewer
;
163 final @Nullable CpuUsageComposite treeViewer
= fTreeViewer
;
164 if (xyViewer
!= null && treeViewer
!= null) {
165 Object data
= getData(CPU_USAGE_FOLLOW_CPU
);
167 data
= new TreeSet
<Integer
>();
169 if (data
instanceof Set
<?
>) {
170 Set
<?
> set
= (Set
<?
>) data
;
171 int core
= signal
.getCore();
173 xyViewer
.addCpu(core
);
174 treeViewer
.addCpu(core
);
175 if (Iterables
.all(set
, Predicates
.instanceOf(Integer
.class))) {
176 @SuppressWarnings("unchecked")
177 Set
<Integer
> intSet
= (Set
<Integer
>) set
;
182 treeViewer
.clearCpu();
183 ((Set
<?
>) data
).clear();
185 saveData(CPU_USAGE_FOLLOW_CPU
, data
);
187 Activator
.getDefault().logError("The followed cores should have been store in a Set"); //$NON-NLS-1$