From: Matthew Khouzam Date: Wed, 9 Mar 2016 22:03:43 +0000 (-0500) Subject: lttng: make Critical path listen to thread selected signal instead of selection listener X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=926c10d3535553a5a002d06cfc49b96321fe6aa8;p=deliverable%2Ftracecompass.git lttng: make Critical path listen to thread selected signal instead of selection listener 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 Reviewed-on: https://git.eclipse.org/r/68099 Reviewed-by: Hudson CI Reviewed-by: Genevieve Bastien Tested-by: Genevieve Bastien --- 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 index 0000000000..d78862c672 --- /dev/null +++ b/analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/signals/package-info.java @@ -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; diff --git a/lttng/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/criticalpath/CriticalPathParameterProvider.java b/lttng/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/criticalpath/CriticalPathParameterProvider.java index c09da07ec5..55eac04333 100644 --- a/lttng/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/criticalpath/CriticalPathParameterProvider.java +++ b/lttng/org.eclipse.tracecompass.lttng2.kernel.ui/src/org/eclipse/tracecompass/internal/lttng2/kernel/ui/criticalpath/CriticalPathParameterProvider.java @@ -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())); } }