analysis: Keep thread selection and follow CPU when switching traces
[deliverable/tracecompass.git] / analysis / org.eclipse.tracecompass.analysis.os.linux.ui / src / org / eclipse / tracecompass / internal / analysis / os / linux / ui / views / cpuusage / CpuUsageXYViewer.java
index be5c552596870ecae9c8cb0b9d67aeec45d0623a..e7b9b8fe73b3a31613e9e7cc183b3d313fe5e6ea 100644 (file)
@@ -29,7 +29,12 @@ import org.eclipse.tracecompass.analysis.os.linux.core.cpuusage.KernelCpuUsageAn
 import org.eclipse.tracecompass.internal.analysis.os.linux.ui.Activator;
 import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
 import org.eclipse.tracecompass.statesystem.core.exceptions.StateValueTypeException;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
+import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
+import org.eclipse.tracecompass.tmf.core.trace.TmfTraceContext;
+import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
 import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
 import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfCommonXLineChartViewer;
 
@@ -43,6 +48,8 @@ import com.google.common.base.Joiner;
  */
 public class CpuUsageXYViewer extends TmfCommonXLineChartViewer {
 
+    private static final int NOT_SELECTED = -1;
+
     private KernelCpuUsageAnalysis fModule = null;
 
     /* Maps a thread ID to a list of y values */
@@ -56,7 +63,7 @@ public class CpuUsageXYViewer extends TmfCommonXLineChartViewer {
     // Timeout between updates in the updateData thread
     private static final long BUILD_UPDATE_TIMEOUT = 500;
 
-    private long fSelectedThread = -1;
+    private long fSelectedThread = NOT_SELECTED;
 
     private final @NonNull Set<@NonNull Integer> fCpus = new TreeSet<>();
 
@@ -69,6 +76,8 @@ public class CpuUsageXYViewer extends TmfCommonXLineChartViewer {
     public CpuUsageXYViewer(Composite parent) {
         super(parent, Messages.CpuUsageXYViewer_Title, Messages.CpuUsageXYViewer_TimeXAxis, Messages.CpuUsageXYViewer_CpuYAxis);
         setResolution(RESOLUTION);
+        getSwtChart().getTitle().setVisible(true);
+        getSwtChart().getLegend().setVisible(false);
     }
 
     @Override
@@ -107,7 +116,7 @@ public class CpuUsageXYViewer extends TmfCommonXLineChartViewer {
             setXAxis(xvalues);
 
             boolean complete = false;
-            long currentEnd = start;
+            long currentEnd = Math.max(ss.getStartTime(), start);
 
             while (!complete && currentEnd < end) {
 
@@ -115,7 +124,7 @@ public class CpuUsageXYViewer extends TmfCommonXLineChartViewer {
                     return;
                 }
 
-                long traceStart = getStartTime();
+                long traceStart = Math.max(getStartTime(), ss.getStartTime());
                 long traceEnd = getEndTime();
                 long offset = getTimeOffset();
                 long selectedThread = fSelectedThread;
@@ -129,7 +138,7 @@ public class CpuUsageXYViewer extends TmfCommonXLineChartViewer {
                 fYValues.clear();
                 fYValues.put(Messages.CpuUsageXYViewer_Total, zeroFill(xvalues.length));
                 String stringSelectedThread = Long.toString(selectedThread);
-                if (selectedThread != -1) {
+                if (selectedThread != NOT_SELECTED) {
                     fYValues.put(stringSelectedThread, zeroFill(xvalues.length));
                 }
 
@@ -283,4 +292,42 @@ public class CpuUsageXYViewer extends TmfCommonXLineChartViewer {
         getSwtChart().getTitle().setText(Messages.CpuUsageView_Title);
     }
 
+    @Override
+    @TmfSignalHandler
+    public void traceSelected(TmfTraceSelectedSignal signal) {
+        initSelection();
+        initCPU();
+        super.traceSelected(signal);
+    }
+
+    @Override
+    @TmfSignalHandler
+    public void traceOpened(TmfTraceOpenedSignal signal) {
+        initSelection();
+        initCPU();
+        super.traceOpened(signal);
+    }
+
+    private void initSelection() {
+        TmfTraceContext ctx = TmfTraceManager.getInstance().getCurrentTraceContext();
+        String data = (String) ctx.getData(CpuUsageView.CPU_USAGE_SELECTED_THREAD);
+        long thread = data != null ? Long.valueOf(data) : NOT_SELECTED;
+        setSelectedThread(thread);
+    }
+
+    private void initCPU() {
+        clearCpu();
+        TmfTraceContext ctx = TmfTraceManager.getInstance().getCurrentTraceContext();
+        Object data =  ctx.getData(CpuUsageView.CPU_USAGE_FOLLOW_CPU);
+        if (data instanceof Set<?>) {
+            Set<?> set = (Set<?>) data;
+            for (Object coreObject : set) {
+                Integer core = (Integer) coreObject;
+                if (core != null && core >= 0) {
+                    addCpu(core);
+                }
+            }
+        }
+    }
+
 }
This page took 0.026165 seconds and 5 git commands to generate.