lttng: make Critical path listen to thread selected signal instead of selection listener
authorMatthew Khouzam <matthew.khouzam@ericsson.com>
Wed, 9 Mar 2016 22:03:43 +0000 (17:03 -0500)
committerMatthew Khouzam <matthew.khouzam@ericsson.com>
Wed, 16 Mar 2016 01:50:46 +0000 (21:50 -0400)
This patch greatly simplifies the critical path parameter provider.
Now it will listen to a TmfThreadSelectedSignal instead of listenning to an
action on the control flow view. This will decouple the critical path from the
control flow view, instead allowing anything generating the signal the opportunity
to run a critical path analysis on a given thread and trace.

Change-Id: Ifb7f1fe2d5f81a8127ceab93b262cc9c0bbdd0e5
Signed-off-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/68099
Reviewed-by: Hudson CI
Reviewed-by: Genevieve Bastien <gbastien+lttng@versatic.net>
Tested-by: Genevieve Bastien <gbastien+lttng@versatic.net>
analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/signals/package-info.java [new file with mode: 0644]
lttng/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/criticalpath/CriticalPathParameterProvider.java

diff --git a/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/signals/package-info.java b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/signals/package-info.java
new file mode 100644 (file)
index 0000000..d78862c
--- /dev/null
@@ -0,0 +1,11 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Ericsson
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+@org.eclipse.jdt.annotation.NonNullByDefault
+package org.eclipse.tracecompass.analysis.os.linux.core.signals;
index c09da07ec5195e402031592a606667fbd7d13bcb..55eac043337abba5dc7a64bcbda2ac880b51b62c 100644 (file)
@@ -9,26 +9,15 @@
 
 package org.eclipse.tracecompass.internal.lttng2.kernel.ui.criticalpath;
 
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.tracecompass.analysis.graph.core.criticalpath.CriticalPathModule;
 import org.eclipse.tracecompass.analysis.os.linux.core.model.HostThread;
-import org.eclipse.tracecompass.analysis.os.linux.ui.views.controlflow.ControlFlowEntry;
-import org.eclipse.tracecompass.analysis.os.linux.ui.views.controlflow.ControlFlowView;
-import org.eclipse.tracecompass.internal.analysis.graph.ui.criticalpath.view.CriticalPathView;
+import org.eclipse.tracecompass.analysis.os.linux.core.signals.TmfThreadSelectedSignal;
 import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngWorker;
 import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
 import org.eclipse.tracecompass.tmf.core.analysis.TmfAbstractAnalysisParamProvider;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
 
 /**
  * Class that provides parameters to the critical path analysis for lttng kernel
@@ -38,89 +27,16 @@ import org.eclipse.ui.PlatformUI;
  */
 public class CriticalPathParameterProvider extends TmfAbstractAnalysisParamProvider {
 
-    private final class IPartListener2Impl implements IPartListener2 {
-
-        private final Class<?> fType;
-
-        IPartListener2Impl(Class<?> type) {
-            fType = type;
-        }
-
-        private void toggleState(IWorkbenchPartReference partRef, boolean state) {
-            if (fType.isInstance(partRef.getPart(false))) {
-                toggleActive(state);
-            }
-        }
-
-        @Override
-        public void partActivated(IWorkbenchPartReference partRef) {
-            toggleState(partRef, true);
-        }
-
-        @Override
-        public void partBroughtToTop(IWorkbenchPartReference partRef) {
-
-        }
-
-        @Override
-        public void partClosed(IWorkbenchPartReference partRef) {
-            toggleState(partRef, false);
-        }
-
-        @Override
-        public void partDeactivated(IWorkbenchPartReference partRef) {
-
-        }
-
-        @Override
-        public void partOpened(IWorkbenchPartReference partRef) {
-            toggleState(partRef, true);
-        }
-
-        @Override
-        public void partHidden(IWorkbenchPartReference partRef) {
-            toggleState(partRef, false);
-        }
-
-        @Override
-        public void partVisible(IWorkbenchPartReference partRef) {
-            toggleState(partRef, true);
-        }
-
-        @Override
-        public void partInputChanged(IWorkbenchPartReference partRef) {
-
-        }
-    }
-
-    private ISelectionListener fSelListener = new ISelectionListener() {
-        @Override
-        public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-            if (selection instanceof IStructuredSelection) {
-                Object element = ((IStructuredSelection) selection).getFirstElement();
-                if (element instanceof ControlFlowEntry) {
-                    ControlFlowEntry entry = (ControlFlowEntry) element;
-                    setCurrentThreadId(entry);
-                }
-            }
-        }
-    };
-
     private static final String NAME = "Critical Path Lttng kernel parameter provider"; //$NON-NLS-1$
 
-    private final IPartListener2 fPartListener = new IPartListener2Impl(CriticalPathView.class);
-
-    private ControlFlowEntry fCurrentEntry = null;
-
-    private boolean fActive = false;
-    private boolean fEntryChanged = false;
+    private HostThread fCurrentHostThread = null;
 
     /**
      * Constructor
      */
     public CriticalPathParameterProvider() {
         super();
-        registerListener();
+        TmfSignalManager.register(this);
     }
 
     @Override
@@ -130,19 +46,17 @@ public class CriticalPathParameterProvider extends TmfAbstractAnalysisParamProvi
 
     @Override
     public Object getParameter(String name) {
-        if (fCurrentEntry == null) {
-            return null;
-        }
         if (name.equals(CriticalPathModule.PARAM_WORKER)) {
+            final HostThread currentHostThread = fCurrentHostThread;
+            if (currentHostThread == null) {
+                return null;
+            }
             /* Try to find the worker for the critical path */
             IAnalysisModule mod = getModule();
             if ((mod != null) && (mod instanceof CriticalPathModule)) {
-                Integer threadId = fCurrentEntry.getThreadId();
-                HostThread ht = new HostThread(fCurrentEntry.getTrace().getHostId(), threadId);
-                LttngWorker worker = new LttngWorker(ht, "", 0); //$NON-NLS-1$
+                LttngWorker worker = new LttngWorker(currentHostThread, "", 0); //$NON-NLS-1$
                 return worker;
             }
-            return fCurrentEntry;
         }
         return null;
     }
@@ -152,57 +66,24 @@ public class CriticalPathParameterProvider extends TmfAbstractAnalysisParamProvi
         return true;
     }
 
-    private void setCurrentThreadId(ControlFlowEntry entry) {
-        if (!entry.equals(fCurrentEntry)) {
-            fCurrentEntry = entry;
-            if (fActive) {
-                this.notifyParameterChanged(CriticalPathModule.PARAM_WORKER);
-            } else {
-                fEntryChanged = true;
-            }
-        }
-    }
-
-    private void toggleActive(boolean active) {
-        if (active != fActive) {
-            fActive = active;
-            if (fActive && fEntryChanged) {
-                this.notifyParameterChanged(CriticalPathModule.PARAM_WORKER);
-                fEntryChanged = false;
-            }
+    private void setCurrentHostThread(HostThread hostThread) {
+        if (!hostThread.equals(fCurrentHostThread)) {
+            fCurrentHostThread = hostThread;
+            notifyParameterChanged(CriticalPathModule.PARAM_WORKER);
         }
     }
 
-    private void registerListener() {
-        if (!PlatformUI.isWorkbenchRunning()) {
-            return;
-        }
-        IWorkbench wb = PlatformUI.getWorkbench();
-        if (wb == null) {
-            return;
-        }
-        IWorkbenchWindow wbw = wb.getActiveWorkbenchWindow();
-        if (wbw == null) {
-            return;
-        }
-        final IWorkbenchPage activePage = wbw.getActivePage();
-        if (activePage == null) {
-            return;
-        }
-
-        /* Activate the update if critical path view visible */
-        IViewPart view = activePage.findView(CriticalPathView.ID);
-        if (view != null) {
-            if (activePage.isPartVisible(view)) {
-                toggleActive(true);
-            }
-        }
-
-        /* Add the listener to the control flow view */
-        view = activePage.findView(ControlFlowView.ID);
-        if (view != null) {
-            view.getSite().getWorkbenchWindow().getSelectionService().addPostSelectionListener(fSelListener);
-            view.getSite().getWorkbenchWindow().getPartService().addPartListener(fPartListener);
+    /**
+     * Signal handler to know that a thread was selected
+     *
+     * @param signal
+     *            the thread was selected
+     */
+    @TmfSignalHandler
+    public void tmfThreadSelectedSignalHander(TmfThreadSelectedSignal signal) {
+        final TmfThreadSelectedSignal threadSignal = signal;
+        if (threadSignal != null) {
+            setCurrentHostThread(new HostThread(threadSignal.getTraceHost(), threadSignal.getThreadId()));
         }
     }
 
This page took 0.027646 seconds and 5 git commands to generate.