From eef48514204e729d062dedb45de2a915ed414fc4 Mon Sep 17 00:00:00 2001 From: Arnaud Fiorini Date: Tue, 18 Aug 2026 13:45:17 -0400 Subject: [PATCH] callstack: get an experiment analysis to show in the flamechart --- .../FlameChartDataProviderFactory.java | 22 ++++----------- .../analysis/profiling/ui/FlameChartView.java | 28 +++++++++++++++---- .../BaseDataProviderTimeGraphView.java | 2 +- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/analysis/org.eclipse.tracecompass.analysis.profiling.core/src/org/eclipse/tracecompass/internal/analysis/profiling/core/instrumented/FlameChartDataProviderFactory.java b/analysis/org.eclipse.tracecompass.analysis.profiling.core/src/org/eclipse/tracecompass/internal/analysis/profiling/core/instrumented/FlameChartDataProviderFactory.java index 43e34c9902..be8c98508a 100644 --- a/analysis/org.eclipse.tracecompass.analysis.profiling.core/src/org/eclipse/tracecompass/internal/analysis/profiling/core/instrumented/FlameChartDataProviderFactory.java +++ b/analysis/org.eclipse.tracecompass.analysis.profiling.core/src/org/eclipse/tracecompass/internal/analysis/profiling/core/instrumented/FlameChartDataProviderFactory.java @@ -57,31 +57,19 @@ public class FlameChartDataProviderFactory implements IDataProviderFactory { if (provider != null) { return provider; } - // Otherwise, see if it's an experiment and create a composite if that's - // the case + // Otherwise, it may be an experiment and the analysis does not apply to an experiment: Collection traces = TmfTraceManager.getTraceSet(trace); if (traces.size() > 1) { - // Try creating a composite only if there are many traces, - // otherwise, the previous call to create should have returned the - // data provider return TmfTimeGraphCompositeDataProvider.create(traces, FlameChartDataProvider.ID, secondaryId); } return null; } private static @Nullable ITmfTreeDataProvider create(ITmfTrace trace, String secondaryId) { - // The trace can be an experiment, so we need to know if there are - // multiple analysis modules with the same ID - Iterable modules = TmfTraceUtils.getAnalysisModulesOfClass(trace, IFlameChartProvider.class); - Iterable filteredModules = Iterables.filter(modules, m -> m.getId().equals(secondaryId)); - Iterator iterator = filteredModules.iterator(); - if (iterator.hasNext()) { - IFlameChartProvider module = iterator.next(); - if (iterator.hasNext()) { - // More than one module, must be an experiment, return null so - // the factory can try with individual traces - return null; - } + Iterable modules = trace.getAnalysisModules(); + modules = Iterables.filter(modules, m -> m.getId().equals(secondaryId)); + Iterator iterator = modules.iterator(); + if (iterator.hasNext() && iterator.next() instanceof IFlameChartProvider module) { module.schedule(); return new FlameChartDataProvider(trace, module, secondaryId); } diff --git a/analysis/org.eclipse.tracecompass.analysis.profiling.ui/src/org/eclipse/tracecompass/internal/analysis/profiling/ui/FlameChartView.java b/analysis/org.eclipse.tracecompass.analysis.profiling.ui/src/org/eclipse/tracecompass/internal/analysis/profiling/ui/FlameChartView.java index 0372f2f87c..4a5ad04e4f 100644 --- a/analysis/org.eclipse.tracecompass.analysis.profiling.ui/src/org/eclipse/tracecompass/internal/analysis/profiling/ui/FlameChartView.java +++ b/analysis/org.eclipse.tracecompass.analysis.profiling.ui/src/org/eclipse/tracecompass/internal/analysis/profiling/ui/FlameChartView.java @@ -88,6 +88,7 @@ import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchActionConstants; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -372,16 +373,32 @@ protected String getProviderId() { return (secondaryId == null) ? FlameChartDataProvider.ID : FlameChartDataProvider.ID + ':' + secondaryId.split(TmfViewFactory.INTERNAL_SECONDARY_ID_SEPARATOR)[0]; // NOSONAR } + @Override + protected Iterable getTracesToBuild(@Nullable ITmfTrace trace) { + if (trace == null) { + return ImmutableSet.of(); + } + return ImmutableSet.of(trace); + } + @Override protected void buildEntryList(final ITmfTrace trace, final ITmfTrace parentTrace, final IProgressMonitor monitor) { - FlameChartDataProvider provider = DataProviderManager - .getInstance().getOrCreateDataProvider(trace, getProviderId(), FlameChartDataProvider.class); + ITimeGraphDataProvider provider = DataProviderManager + .getInstance().fetchOrCreateDataProvider(trace, getProviderId(), ITimeGraphDataProvider.class); if (provider == null) { addUnavailableEntry(trace, parentTrace); return; } - - provider.resetFunctionNames(monitor); + /* + * TODO: the reset function names method is not available in the TSP. A + * solution should be added to either support the call or get rid of + * this function and make the symbol cache flushing implicit. It will + * also make this function work with the composite data provider as the + * cache flushing is only available on the flame chart data provider. + */ + if (provider instanceof FlameChartDataProvider flameChartDataProvider) { + flameChartDataProvider.resetFunctionNames(monitor); + } super.buildEntryList(trace, parentTrace, monitor); } @@ -626,7 +643,8 @@ public void run() { if (dialog.open() == IDialogConstants.OK_ID) { /* * Nothing to do. SymbolProviderConfigDialog will send a - * TmfSymbolProviderUpdatedSignal to notify registered components. + * TmfSymbolProviderUpdatedSignal to notify registered + * components. */ } } diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/BaseDataProviderTimeGraphView.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/BaseDataProviderTimeGraphView.java index b721198596..e90edf24dc 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/BaseDataProviderTimeGraphView.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/BaseDataProviderTimeGraphView.java @@ -178,7 +178,7 @@ public void createPartControl(Composite parent) { @Override protected void buildEntryList(@NonNull ITmfTrace trace, @NonNull ITmfTrace parentTrace, @NonNull IProgressMonitor monitor) { ITimeGraphDataProvider<@NonNull TimeGraphEntryModel> dataProvider = DataProviderManager - .getInstance().getOrCreateDataProvider(trace, getProviderId(), ITimeGraphDataProvider.class); + .getInstance().fetchOrCreateDataProvider(trace, getProviderId(), ITimeGraphDataProvider.class); if (dataProvider == null) { return; }