package org.eclipse.tracecompass.internal.analysis.timing.core.callgraph;
+import java.util.Collection;
import java.util.Comparator;
import org.eclipse.jdt.annotation.NonNull;
// FIXME work around this trace
ITmfTrace trace = TmfTraceManager.getInstance().getActiveTrace();
if (trace != null) {
- String symbolText;
+ String symbolText = null;
Object symbol = calledFunction.getSymbol();
if (symbol instanceof Long) {
Long longAddress = (Long) symbol;
- ISymbolProvider provider = SymbolProviderManager.getInstance().getSymbolProvider(trace);
- symbolText = provider.getSymbolText(longAddress);
+ Collection<ISymbolProvider> providers = SymbolProviderManager.getInstance().getSymbolProviders(trace);
+ for (ISymbolProvider provider: providers) {
+ symbolText = provider.getSymbolText(longAddress);
+ if (symbolText != null) {
+ break;
+ }
+ }
if (symbolText == null) {
return "0x" + Long.toHexString(longAddress); //$NON-NLS-1$
}
long time = segment.getStart();
int pid = calledFunction.getProcessId();
if (pid > 0) {
- String text = provider.getSymbolText(pid, time, longAddress);
- if (text != null) {
- return text;
+ for (ISymbolProvider provider: providers) {
+ String text = provider.getSymbolText(pid, time, longAddress);
+ if (text != null) {
+ return text;
+ }
}
}
return symbolText;
*******************************************************************************/
package org.eclipse.tracecompass.internal.analysis.timing.ui.callgraph.statistics;
+import java.util.Collection;
+import java.util.Collections;
import java.util.Objects;
import java.util.function.Function;
private static final class SymbolFormatter implements Function<SegmentStoreStatisticsEntry, String> {
- private final @Nullable ISymbolProvider fSymbolProvider;
+ private final Collection<ISymbolProvider> fSymbolProviders;
public SymbolFormatter(@Nullable ITmfTrace trace) {
- fSymbolProvider = trace != null ? SymbolProviderManager.getInstance().getSymbolProvider(trace) : null;
+ fSymbolProviders = trace != null ? SymbolProviderManager.getInstance().getSymbolProviders(trace) : Collections.EMPTY_SET;
}
@Override
public String apply(@Nullable SegmentStoreStatisticsEntry stat) {
-
- String original = (stat == null) ? "null" : stat.getName(); //$NON-NLS-1$
- ISymbolProvider symbolProvider = fSymbolProvider;
- if (symbolProvider == null) {
- return original;
+ if (stat == null) {
+ return "null"; //$NON-NLS-1$
}
+ String original = stat.getName();
try {
Long address = Long.decode(original);
- String res = symbolProvider.getSymbolText(address);
- if (res != null) {
- return res;
+ Collection<ISymbolProvider> symbolProviders = fSymbolProviders;
+ for (ISymbolProvider symbol : symbolProviders) {
+ String res = symbol.getSymbolText(address);
+ if (res != null) {
+ return res;
+ }
}
return "0x" + Long.toHexString(address); //$NON-NLS-1$
} catch (NumberFormatException e) {
- // it's OK, ignore it
+ return original;
}
- return original;
}
}
import org.eclipse.tracecompass.internal.analysis.timing.core.callgraph.AggregatedCalledFunctionStatistics;
import org.eclipse.tracecompass.internal.analysis.timing.core.callgraph.ICalledFunction;
import org.eclipse.tracecompass.internal.analysis.timing.core.callgraph.SymbolAspect;
-import org.eclipse.tracecompass.tmf.core.symbols.ISymbolProvider;
-import org.eclipse.tracecompass.tmf.core.symbols.SymbolProviderManager;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.StateItem;
*
* @param fGEvent
* An event
- * @param symbolProvider
- * A symbol provider
*/
- private static String getFuntionSymbol(FlamegraphEvent event, ISymbolProvider symbolProvider) {
+ private static String getFunctionSymbol(FlamegraphEvent event) {
String funcSymbol = ""; //$NON-NLS-1$
if (event.getSymbol() instanceof Long || event.getSymbol() instanceof Integer) {
ITmfTrace activeTrace = TmfTraceManager.getInstance().getActiveTrace();
if (activeTrace != null) {
FlamegraphEvent fgEvent = (FlamegraphEvent) event;
- ISymbolProvider symbolProvider = SymbolProviderManager.getInstance().getSymbolProvider(activeTrace);
- funcSymbol = getFuntionSymbol(fgEvent, symbolProvider);
+ funcSymbol = getFunctionSymbol(fgEvent);
}
gc.setForeground(gc.getDevice().getSystemColor(SWT.COLOR_WHITE));
Utils.drawText(gc, funcSymbol, bounds.x, bounds.y, bounds.width, bounds.height, true, true);
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
* @param trace
* The trace to create a provider for
* @return a valid {@link ISymbolProvider}, never null
+ * @deprecated Use {@link #getSymbolProviders(ITmfTrace)} instead
*/
+ @Deprecated
public ISymbolProvider getSymbolProvider(ITmfTrace trace) {
+ return localGetSymbolProvider(trace);
+ }
+
+ private ISymbolProvider localGetSymbolProvider(ITmfTrace trace) {
// Check to see if we already have a provider for this trace
synchronized (fInstances) {
WeakReference<ISymbolProvider> reference = fInstances.get(trace);
return new DefaultSymbolProvider(trace);
}
+ /**
+ * Locate the {@link ISymbolProvider}s capable to resolve symbols from the
+ * given trace. If no such provider is defined an instance of
+ * {@link DefaultSymbolProvider} will be returned
+ *
+ * @param trace
+ * The trace to create a provider for
+ * @return The collection of symbol providers for this trace. It will
+ * contain at least one valid {@link ISymbolProvider}.
+ */
+ public Collection<ISymbolProvider> getSymbolProviders(ITmfTrace trace) {
+ // TODO Implement support for multiple symbol providers
+ return Collections.singleton(localGetSymbolProvider(trace));
+ }
+
}