}
public static String PreferencePage_WindowDescription;
+ public static String PreferencePage_TabTitle;
public static String PreferencePage_CheckboxLabel;
public static String PreferencePage_CheckboxTooltip;
* 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;
super(provider);
setDescription(MessageFormat.format(Messages.PreferencePage_WindowDescription, provider.getTrace().getName()));
setValid(true);
+ setTitle(MessageFormat.format(Messages.PreferencePage_TabTitle, provider.getTrace().getName()));
}
@Override
###############################################################################
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 = \
* 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;
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;
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
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
}
/**
- * 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();
}
}
* 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;
super(provider);
setDescription(MessageFormat.format(Messages.BasicSymbolProviderPrefPage_description, provider.getTrace().getName()));
setValid(true);
+ setTitle(MessageFormat.format(Messages.BasicSymbolProviderPrefPage_tabTitle, provider.getTrace().getName()));
}
@Override
if (!file.isFile()) {
errorMessage = Messages.BasicSymbolProviderPrefPage_errorFileDoesNotExists;
}
- } else {
- errorMessage = Messages.BasicSymbolProviderPrefPage_errorSpecifyFile;
}
setErrorMessage(errorMessage);
setValid(errorMessage == null);
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;
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
* 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;
*/
public AbstractSymbolProviderPreferencePage(ISymbolProvider provider) {
fProvider = provider;
- setTitle(provider.getTrace().getName());
noDefaultAndApplyButton();
}
* 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;
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
*
// Fields
// ------------------------------------------------------------------------
- private final Map<ITmfTrace, ISymbolProvider> fSymbolProviders = new HashMap<>();
+ private final Multimap<ITmfTrace, ISymbolProvider> fSymbolProviders = LinkedHashMultimap.create();
// The next event action
private Action fNextEventAction;
super.traceClosed(signal);
synchronized (fSymbolProviders) {
for (ITmfTrace trace : getTracesToBuild(signal.getTrace())) {
- fSymbolProviders.remove(trace);
+ fSymbolProviders.removeAll(trace);
}
}
}
* 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 */
} 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;
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);
+ }
}
}
}