blob: 3add19ab41f91c9ea68ba4cc6bfa1b787644ef4d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.internal.lttng2.kernel.ui.criticalpath;
import org.eclipse.tracecompass.analysis.graph.core.criticalpath.CriticalPathModule;
import org.eclipse.tracecompass.analysis.os.linux.core.execution.graph.OsWorker;
import org.eclipse.tracecompass.analysis.os.linux.core.model.HostThread;
import org.eclipse.tracecompass.analysis.os.linux.core.signals.TmfThreadSelectedSignal;
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.signal.TmfTraceSelectedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
/**
* Class that provides parameters to the critical path analysis for lttng kernel
* traces
*
* @author Geneviève Bastien
*/
public class CriticalPathParameterProvider extends TmfAbstractAnalysisParamProvider {
private static final String NAME = "Critical Path Lttng kernel parameter provider"; //$NON-NLS-1$
private HostThread fCurrentHostThread = null;
/**
* Constructor
*/
public CriticalPathParameterProvider() {
super();
TmfSignalManager.register(this);
}
@Override
public void dispose() {
super.dispose();
TmfSignalManager.deregister(this);
}
@Override
public String getName() {
return NAME;
}
@Override
public Object getParameter(String name) {
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 instanceof CriticalPathModule) {
OsWorker worker = new OsWorker(currentHostThread, "", 0); //$NON-NLS-1$
return worker;
}
}
return null;
}
@Override
public boolean appliesToTrace(ITmfTrace trace) {
return true;
}
private void setCurrentHostThread(HostThread hostThread) {
if (!hostThread.equals(fCurrentHostThread)) {
fCurrentHostThread = hostThread;
notifyParameterChanged(CriticalPathModule.PARAM_WORKER);
}
}
/**
* 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()));
}
}
/**
* Reset the selection when a new trace is selected
*
* @param signal The trace selected signal
*/
@TmfSignalHandler
public void traceSelected(TmfTraceSelectedSignal signal) {
fCurrentHostThread = null;
}
}