tmf: Update API for multiple symbol providers
authorGeneviève Bastien <gbastien+lttng@versatic.net>
Mon, 15 May 2017 15:52:33 +0000 (11:52 -0400)
committerGenevieve Bastien <gbastien+lttng@versatic.net>
Fri, 19 May 2017 13:28:52 +0000 (09:28 -0400)
This prepares the API to support multiple symbol providers for a trace,
it does not add the support yet.

Change-Id: I9e3e926aa495b2fa236d3cfa3255edbfcf0b532d
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
Reviewed-on: https://git.eclipse.org/r/97124
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-by: Hudson CI
Reviewed-by: Jean-Christian Kouame <jean-christian.kouame@ericsson.com>
analysis/org.eclipse.tracecompass.analysis.timing.core/src/org/eclipse/tracecompass/internal/analysis/timing/core/callgraph/SymbolAspect.java
analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/callgraph/statistics/CallGraphStatisticsViewer.java
analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/internal/analysis/timing/ui/flamegraph/FlameGraphPresentationProvider.java
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/symbols/SymbolProviderManager.java

index 0038ee791f6787b21ad3e614f5ba9e5c6c4ccb29..2e82dce519304a9609e2c318ad27d362c3117d47 100644 (file)
@@ -9,6 +9,7 @@
 
 package org.eclipse.tracecompass.internal.analysis.timing.core.callgraph;
 
+import java.util.Collection;
 import java.util.Comparator;
 
 import org.eclipse.jdt.annotation.NonNull;
@@ -69,12 +70,17 @@ public final class SymbolAspect implements ISegmentAspect {
             // 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$
                     }
@@ -82,9 +88,11 @@ public final class SymbolAspect implements ISegmentAspect {
                     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;
index 657bc024cbe4396bf571928924e17a2df54d3cd5..d101cdcfba04518e2565d9e6deb04e48c913e0a9 100644 (file)
@@ -8,6 +8,8 @@
  *******************************************************************************/
 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;
 
@@ -31,31 +33,31 @@ public class CallGraphStatisticsViewer extends AbstractSegmentsStatisticsViewer
 
     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;
         }
     }
 
index 5d880514a7d650c3a82f87f699313a4b343ec52c..e14931e33704a1b58023d42f71a29a843f2ea6e6 100644 (file)
@@ -20,8 +20,6 @@ import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.SubSecondT
 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;
@@ -125,10 +123,8 @@ public class FlameGraphPresentationProvider extends TimeGraphPresentationProvide
      *
      * @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) {
 
@@ -162,8 +158,7 @@ public class FlameGraphPresentationProvider extends TimeGraphPresentationProvide
         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);
index bf638f0ae55134badfd6167f11342eb1db979e9a..c186f8b3b3261855b632d10fa857161d2850bccb 100644 (file)
@@ -13,6 +13,8 @@ import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
 
 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;
@@ -117,8 +119,14 @@ public final class SymbolProviderManager {
      * @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);
@@ -142,4 +150,19 @@ public final class SymbolProviderManager {
         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));
+    }
+
 }
This page took 0.027786 seconds and 5 git commands to generate.