blob: dba91199143f66605401bdbeccf6dd84a0035b5a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 É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.analysis.profiling.core.tests.stubs;
import java.util.List;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.analysis.profiling.core.callstack.CallStackAnalysis;
import org.eclipse.tracecompass.analysis.profiling.core.callstack.CallStackHostUtils;
import org.eclipse.tracecompass.analysis.profiling.core.callstack.CallStackSeries;
import org.eclipse.tracecompass.internal.analysis.profiling.core.callgraph.CallGraphAnalysis;
import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
import org.eclipse.tracecompass.statesystem.core.ITmfStateSystemBuilder;
import org.eclipse.tracecompass.tmf.core.statesystem.ITmfStateProvider;
import com.google.common.collect.ImmutableList;
/**
* A stub callgraph analysis, using a state system fixture not necessarily built
* from the {@link CallStackAnalysis} base class. It allows to specify the
* callstack analysis from a state system and the patterns to use for each
* grouping level of the callstack.
*
* @author Geneviève Bastien
*/
@NonNullByDefault
public class CallGraphAnalysisStub extends CallGraphAnalysis {
/**
* The first level of the hierarchy
*/
public static final String PROCESS_PATH = "Processes";
/**
* The second level of the callstack hierarchy
*/
public static final String THREAD_PATH = "Thread";
/**
* The third level of the callstack hierarchy
*/
public static final String CALLSTACK_PATH = "CallStack";
private static final String[] PP = { PROCESS_PATH };
private static final String[] TP = { THREAD_PATH };
private static final List<String[]> PATTERNS = ImmutableList.of(PP, TP);
private static class CSAnalysis extends CallStackAnalysis {
private final ITmfStateSystem fSs;
private final @Nullable List<String[]> fPatterns;
public CSAnalysis(ITmfStateSystem fixture) {
fSs = fixture;
fPatterns = null;
}
public CSAnalysis(ITmfStateSystem fixture, List<String[]> patterns) {
fSs = fixture;
fPatterns = patterns;
}
@Override
public @Nullable ITmfStateSystem getStateSystem() {
return fSs;
}
@Override
public @Nullable CallStackSeries getCallStackSeries() {
List<String @NonNull []> patterns = fPatterns;
return new CallStackSeries(fSs, patterns == null ? PATTERNS : patterns, 0, "", new CallStackHostUtils.TraceHostIdResolver(getTrace()), new CallStackSeries.AttributeValueThreadResolver(1)); //$NON-NLS-1$
}
@Override
protected @NonNull ITmfStateProvider createStateProvider() {
throw new UnsupportedOperationException();
}
@Override
public List<String[]> getPatterns() {
return super.getPatterns();
}
}
private final CallStackAnalysis fCsProvider;
/**
* Constructor
*
* @param fixture
* The state system to use for this analysis
*/
public CallGraphAnalysisStub(ITmfStateSystemBuilder fixture) {
this(new CSAnalysis(fixture));
}
/**
* Constructor with patterns
*
* @param fixture
* The state system to use for this analysis
* @param patterns
* The patterns to each level of the callstack hierarchy
*/
public CallGraphAnalysisStub(ITmfStateSystemBuilder fixture, List<String[]> patterns) {
this(new CSAnalysis(fixture, patterns));
}
private CallGraphAnalysisStub(CallStackAnalysis csp) {
super(csp);
fCsProvider = csp;
}
/**
* Will trigger the iteration over the callstack series
*
* @return The return value of the iteration
*/
public boolean iterate() {
CallStackSeries callStackSeries = fCsProvider.getCallStackSeries();
if (callStackSeries == null) {
throw new NullPointerException();
}
String[] threadsPattern = fCsProvider.getThreadsPattern();
String[] processesPattern = fCsProvider.getProcessesPattern();
ITmfStateSystem ss = fCsProvider.getStateSystem();
if (ss == null) {
throw new NullPointerException();
}
return iterateOverStateSystem(ss, threadsPattern, processesPattern, new NullProgressMonitor());
}
@Override
public void dispose() {
super.dispose();
fCsProvider.dispose();
}
}