tmf/lttng2: support multiple symbol providers
authorMikael Ferland <mikael.ferland@ericsson.com>
Tue, 23 May 2017 20:21:26 +0000 (16:21 -0400)
committerMatthew Khouzam <matthew.khouzam@ericsson.com>
Wed, 31 May 2017 19:40:08 +0000 (15:40 -0400)
The basic symbol provider is now available for all call stack
analyses.

Change-Id: Ic359d12b4027977ca4a2e6c3cb30e1c780c92e41
Signed-off-by: Mikael Ferland <mikael.ferland@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/97924
Tested-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-by: Genevieve Bastien <gbastien+lttng@versatic.net>
Tested-by: Genevieve Bastien <gbastien+lttng@versatic.net>
Reviewed-by: Hudson CI
lttng/org.eclipse.tracecompass.lttng2.ust.ui/src/org/eclipse/tracecompass/internal/lttng2/ust/ui/analysis/debuginfo/Messages.java
lttng/org.eclipse.tracecompass.lttng2.ust.ui/src/org/eclipse/tracecompass/internal/lttng2/ust/ui/analysis/debuginfo/UstDebugInfoSymbolProviderPreferencePage.java
lttng/org.eclipse.tracecompass.lttng2.ust.ui/src/org/eclipse/tracecompass/internal/lttng2/ust/ui/analysis/debuginfo/messages.properties
tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/symbols/SymbolProviderManager.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/symbols/BasicSymbolProviderPreferencePage.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/symbols/Messages.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/symbols/messages.properties
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/symbols/AbstractSymbolProviderPreferencePage.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/callstack/CallStackView.java

index 30a2865ba7c9c6ffadf9bd2ef9d6b6e400110739..c49934fec660fb030d32097cee3d9c39727ac5a5 100644 (file)
@@ -31,6 +31,7 @@ public class Messages extends NLS {
     }
 
     public static String PreferencePage_WindowDescription;
+    public static String PreferencePage_TabTitle;
 
     public static String PreferencePage_CheckboxLabel;
     public static String PreferencePage_CheckboxTooltip;
index 5fdac6253a424a3148da0e86b967d0423799f63f..c6aacb3491c7acd29fae28f5bf58a36d32b9d000 100644 (file)
@@ -5,6 +5,10 @@
  * made available under the terms of the Eclipse Public License v1.0 which
  * accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Alexandre Montplaisir - Initial API and implementation
+ *   Mikael Ferland - Adjust title of preference pages for multiple symbol providers
  *******************************************************************************/
 
 package org.eclipse.tracecompass.internal.lttng2.ust.ui.analysis.debuginfo;
@@ -56,6 +60,7 @@ public class UstDebugInfoSymbolProviderPreferencePage extends AbstractSymbolProv
         super(provider);
         setDescription(MessageFormat.format(Messages.PreferencePage_WindowDescription, provider.getTrace().getName()));
         setValid(true);
+        setTitle(MessageFormat.format(Messages.PreferencePage_TabTitle, provider.getTrace().getName()));
     }
 
     @Override
index 5f340657e4d6dafcc2975a875491ef8fa914fb73..5d2e3fb187ace98ef8fd6de940c76e1dc9441bc3 100644 (file)
@@ -8,6 +8,7 @@
 ###############################################################################
 
 PreferencePage_WindowDescription=Multi-binary symbol mapping configuration for LTTng-UST 2.8+ trace "{0}"
+PreferencePage_TabTitle= LTTng - {0}
 
 PreferencePage_CheckboxLabel = Use custom target root directory
 PreferencePage_CheckboxTooltip = \
index c186f8b3b3261855b632d10fa857161d2850bccb..0b36fcff8429d7f4df10b2720731df27ba72b528 100644 (file)
@@ -5,6 +5,10 @@
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors
+ *    Robert Kiss - Initial API and implementation
+ *    Mikael Ferland - Support multiple symbol providers for a trace
  *******************************************************************************/
 
 package org.eclipse.tracecompass.tmf.core.symbols;
@@ -17,8 +21,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
-import java.util.Map;
-import java.util.WeakHashMap;
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
@@ -27,6 +29,9 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.tracecompass.internal.tmf.core.Activator;
 import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
 
+import com.google.common.collect.LinkedHashMultimap;
+import com.google.common.collect.Multimap;
+
 /**
  * This class offer services around the
  * <code>org.eclipse.tracecompass.tmf.core.symbolProvider</code> extension
@@ -50,7 +55,7 @@ public final class SymbolProviderManager {
 
     private final List<SymbolProviderFactoryWrapper> fProviders;
 
-    private final Map<ITmfTrace, WeakReference<ISymbolProvider>> fInstances = new WeakHashMap<>();
+    private final Multimap<ITmfTrace, WeakReference<ISymbolProvider>> fInstances = LinkedHashMultimap.create();
 
     /**
      * Internal class used to store extension point information
@@ -112,57 +117,57 @@ public final class SymbolProviderManager {
     }
 
     /**
-     * Locate an {@link ISymbolProvider} capable to resolve symbols from the
-     * given trace. If no such provider is defined an instance of
-     * {@link DefaultSymbolProvider} will be returned
+     * Locate the {@link ISymbolProvider}s capable of resolving symbols from the
+     * given trace. If no such provider(s) are defined, a collection containing
+     * an instance of {@link DefaultSymbolProvider} will be returned
      *
      * @param trace
      *            The trace to create a provider for
-     * @return a valid {@link ISymbolProvider}, never null
-     * @deprecated Use {@link #getSymbolProviders(ITmfTrace)} instead
+     * @return The collection of symbol providers for this trace. It will
+     *         contain at least one valid {@link ISymbolProvider}.
      */
-    @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
+    public Collection<ISymbolProvider> getSymbolProviders(ITmfTrace trace) {
         synchronized (fInstances) {
-            WeakReference<ISymbolProvider> reference = fInstances.get(trace);
-            if (reference != null) {
+            Collection<ISymbolProvider> symbolProviders = new ArrayList<>();
+
+            // Verify if there are already provider(s) for this trace
+            for (WeakReference<ISymbolProvider> reference : fInstances.get(trace)) {
                 ISymbolProvider provider = reference.get();
                 if (provider != null) {
-                    return provider;
+                    symbolProviders.add(provider);
                 }
             }
-            // we don't have yet an instance, build one
-            for (SymbolProviderFactoryWrapper wrapper : fProviders) {
-                ISymbolProviderFactory factory = wrapper.factory;
-                ISymbolProvider provider = factory.createProvider(trace);
-                if (provider != null) {
-                    fInstances.put(trace, new WeakReference<>(provider));
-                    return provider;
+
+            // Build the appropriate provider(s)
+            if (symbolProviders.isEmpty()) {
+                for (SymbolProviderFactoryWrapper wrapper : fProviders) {
+                    ISymbolProviderFactory factory = wrapper.factory;
+                    ISymbolProvider provider = factory.createProvider(trace);
+                    if (provider != null) {
+                        symbolProviders.add(provider);
+                        fInstances.put(trace, new WeakReference<>(provider));
+                    }
                 }
             }
+
+            // Build the default provider if required
+            return !symbolProviders.isEmpty() ? symbolProviders : Collections.singleton(new DefaultSymbolProvider(trace));
         }
-        // No provider found, return the default one
-        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));
+   /**
+    * Locate an {@link ISymbolProvider} 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 a valid {@link ISymbolProvider}, never null
+    * @deprecated Use {@link #getSymbolProviders(ITmfTrace)} instead
+    */
+    @Deprecated
+    public ISymbolProvider getSymbolProvider(ITmfTrace trace) {
+        return getSymbolProviders(trace).iterator().next();
     }
 
 }
index fdd02086e1011ed926c35e11eaa4d7464f2a49e4..1590dcf2f5dd03b96867447f52bde2c7448d4e97 100644 (file)
@@ -6,6 +6,10 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
+ * Contributors:
+ *   Robert Kiss - Initial API and implementation
+ *   Mikael Ferland - Adjust title of preference pages for multiple symbol providers
+ *
  *******************************************************************************/
 
 package org.eclipse.tracecompass.internal.tmf.ui.symbols;
@@ -54,6 +58,7 @@ public class BasicSymbolProviderPreferencePage extends AbstractSymbolProviderPre
         super(provider);
         setDescription(MessageFormat.format(Messages.BasicSymbolProviderPrefPage_description, provider.getTrace().getName()));
         setValid(true);
+        setTitle(MessageFormat.format(Messages.BasicSymbolProviderPrefPage_tabTitle, provider.getTrace().getName()));
     }
 
     @Override
@@ -187,8 +192,6 @@ public class BasicSymbolProviderPreferencePage extends AbstractSymbolProviderPre
             if (!file.isFile()) {
                 errorMessage = Messages.BasicSymbolProviderPrefPage_errorFileDoesNotExists;
             }
-        } else {
-            errorMessage = Messages.BasicSymbolProviderPrefPage_errorSpecifyFile;
         }
         setErrorMessage(errorMessage);
         setValid(errorMessage == null);
index acd6b371e43cbd819c92f6d3a18597e6fd1dbed1..e00411aaa87dd3fe45a831b63a2fc6b4138553ab 100644 (file)
@@ -32,6 +32,7 @@ public class Messages extends NLS {
     public static String BasicSymbolProviderPrefPage_radioMappingFile_tooltip;
     public static String BasicSymbolProviderPrefPage_btnBrowse;
     public static String BasicSymbolProviderPrefPage_description;
+    public static String BasicSymbolProviderPrefPage_tabTitle;
     public static String BasicSymbolProviderPrefPage_ImportMappingDialogTitle;
     public static String BasicSymbolProviderPrefPage_ImportBinaryFileDialogTitle;
     public static String BasicSymbolProviderPrefPage_errorFileDoesNotExists;
index 1fbfeade3320d9244acabb46e47e0e7a0669b253..de410689f4f7084708431f9e377c05abe25a8afd 100644 (file)
@@ -15,6 +15,7 @@ to produce the selected trace.\n\
 Such a file can be generated using the 'nm' tool.
 BasicSymbolProviderPrefPage_btnBrowse=Browse...
 BasicSymbolProviderPrefPage_description=Single-binary symbol mapping configuration for trace "{0}"
+BasicSymbolProviderPrefPage_tabTitle=GNU nm - {0}
 BasicSymbolProviderPrefPage_ImportMappingDialogTitle=Select Mapping File
 BasicSymbolProviderPrefPage_ImportBinaryFileDialogTitle=Select Binary File
 BasicSymbolProviderPrefPage_errorFileDoesNotExists=The current path is not a file or it does not exist
index 1c9544cd0083473dc3008524b8c5ade8976bba53..63e704eeeb06eed60dc4c60c14fb3336ac15b808 100644 (file)
@@ -6,6 +6,10 @@
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
+ * Contributors:
+ *   Robert Kiss - Initial API and implementation
+ *   Mikael Ferland - Adjust title of preference pages for multiple symbol providers
+ *
  *******************************************************************************/
 
 package org.eclipse.tracecompass.tmf.ui.symbols;
@@ -33,7 +37,6 @@ public abstract class AbstractSymbolProviderPreferencePage extends PreferencePag
      */
     public AbstractSymbolProviderPreferencePage(ISymbolProvider provider) {
         fProvider = provider;
-        setTitle(provider.getTrace().getName());
         noDefaultAndApplyButton();
     }
 
index a0cdbd1ea85dfb0ebda0717f9e5ae7adfb14ac97..e2f25654d9391426d46c3893fb8b228168af1467 100644 (file)
  *   Patrick Tasse - Initial API and implementation
  *   Bernd Hufmann - Updated signal handling
  *   Marc-Andre Laperle - Map from binary file
+ *   Mikael Ferland - Support multiple symbol providers for a trace
  *******************************************************************************/
 
 package org.eclipse.tracecompass.tmf.ui.views.callstack;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -89,6 +91,9 @@ import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeGraphContro
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IWorkbenchActionConstants;
 
+import com.google.common.collect.LinkedHashMultimap;
+import com.google.common.collect.Multimap;
+
 /**
  * Main implementation for the Call Stack view
  *
@@ -146,7 +151,7 @@ public class CallStackView extends AbstractTimeGraphView {
     // Fields
     // ------------------------------------------------------------------------
 
-    private final Map<ITmfTrace, ISymbolProvider> fSymbolProviders = new HashMap<>();
+    private final Multimap<ITmfTrace, ISymbolProvider> fSymbolProviders = LinkedHashMultimap.create();
 
     // The next event action
     private Action fNextEventAction;
@@ -505,7 +510,7 @@ public class CallStackView extends AbstractTimeGraphView {
         super.traceClosed(signal);
         synchronized (fSymbolProviders) {
             for (ITmfTrace trace : getTracesToBuild(signal.getTrace())) {
-                fSymbolProviders.remove(trace);
+                fSymbolProviders.removeAll(trace);
             }
         }
     }
@@ -530,11 +535,11 @@ public class CallStackView extends AbstractTimeGraphView {
          * provide a call stack analysis module. See
          * https://bugs.eclipse.org/bugs/show_bug.cgi?id=494212
          */
-        ISymbolProvider provider = fSymbolProviders.get(trace);
-        if (provider == null) {
-            provider = SymbolProviderManager.getInstance().getSymbolProvider(trace);
-            provider.loadConfiguration(new NullProgressMonitor());
-            fSymbolProviders.put(trace, provider);
+        Collection<ISymbolProvider> providers = fSymbolProviders.get(trace);
+        if (providers.isEmpty()) {
+            providers = SymbolProviderManager.getInstance().getSymbolProviders(trace);
+            providers.forEach( (provider) -> provider.loadConfiguration(new NullProgressMonitor()));
+            fSymbolProviders.putAll(trace, providers);
         }
 
         /* Continue with the call stack view specific operations */
@@ -909,8 +914,7 @@ public class CallStackView extends AbstractTimeGraphView {
         } catch (StateValueTypeException e) {
         }
         if (address != Long.MAX_VALUE) {
-            ISymbolProvider provider = fSymbolProviders.get(trace);
-            if (provider != null) {
+            for (ISymbolProvider provider : fSymbolProviders.get(trace)) {
                 String symbol = provider.getSymbolText(processId, timestamp, address);
                 if (symbol != null) {
                     name = symbol;
@@ -1269,12 +1273,13 @@ public class CallStackView extends AbstractTimeGraphView {
         ITmfTrace trace = getTrace();
         if (trace != null) {
             for (ITmfTrace subTrace : getTracesToBuild(trace)) {
-                ISymbolProvider provider = fSymbolProviders.get(subTrace);
-                if (provider instanceof org.eclipse.tracecompass.tmf.ui.symbols.ISymbolProvider) {
-                    org.eclipse.tracecompass.tmf.ui.symbols.ISymbolProvider provider2 = (org.eclipse.tracecompass.tmf.ui.symbols.ISymbolProvider) provider;
-                    ISymbolProviderPreferencePage page = provider2.createPreferencePage();
-                    if (page != null) {
-                        pages.add(page);
+                for (ISymbolProvider provider : fSymbolProviders.get(subTrace)) {
+                    if (provider instanceof org.eclipse.tracecompass.tmf.ui.symbols.ISymbolProvider) {
+                        org.eclipse.tracecompass.tmf.ui.symbols.ISymbolProvider provider2 = (org.eclipse.tracecompass.tmf.ui.symbols.ISymbolProvider) provider;
+                        ISymbolProviderPreferencePage page = provider2.createPreferencePage();
+                        if (page != null) {
+                            pages.add(page);
+                        }
                     }
                 }
             }
This page took 0.032051 seconds and 5 git commands to generate.