blob: ba6a601487ffc4a412359a91b3e90eaa700a4f4a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Ericsson
*
* 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.analysis.profiling.ui.callgraph;
import java.util.Objects;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.tracecompass.analysis.profiling.core.callgraph.ICallGraphProvider;
import org.eclipse.tracecompass.analysis.profiling.core.callstack.CallStackAnalysis;
import org.eclipse.tracecompass.analysis.timing.core.segmentstore.ISegmentStoreProvider;
import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.table.AbstractSegmentStoreTableViewer;
import org.eclipse.tracecompass.internal.analysis.profiling.core.callgraph.CallGraphAnalysis;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
import com.google.common.collect.Iterables;
/**
* Displays the Call Stack data in a column table
*
* @author Sonia Farrah
*/
public class CallGraphTableViewer extends AbstractSegmentStoreTableViewer {
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
/**
* Constructor
*
* @param tableViewer
* The table viewer
*/
public CallGraphTableViewer(@NonNull TableViewer tableViewer) {
super(tableViewer);
}
// ------------------------------------------------------------------------
// Operations
// ------------------------------------------------------------------------
@Override
protected @Nullable ISegmentStoreProvider getSegmentStoreProvider(@NonNull ITmfTrace trace) {
Iterable<CallStackAnalysis> csModules = TmfTraceUtils.getAnalysisModulesOfClass(trace, CallStackAnalysis.class);
@Nullable CallStackAnalysis csModule = Iterables.getFirst(csModules, null);
if (csModule == null) {
return null;
}
csModule.schedule();
ICallGraphProvider cgModule = csModule.getCallGraph();
if (!(cgModule instanceof CallGraphAnalysis)) {
return null;
}
CallGraphAnalysis module = (CallGraphAnalysis) cgModule;
Job job = new Job(Messages.CallGraphAnalysis) {
@Override
protected IStatus run(IProgressMonitor monitor) {
// The callgraph module will be scheduled by the callstack analysis, but we need
// to wait for its specific termination
module.waitForCompletion(Objects.requireNonNull((monitor)));
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
}
};
job.schedule();
return csModule;
}
}