Bug 303153 - Live debug session is messed up after terminating snapshot launch session
diff --git a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/BaseDwarfTestCase.java b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/BaseDwarfTestCase.java index 677f23f..f42e1d3 100644 --- a/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/BaseDwarfTestCase.java +++ b/org.eclipse.cdt.debug.edc.tests/src/org/eclipse/cdt/debug/edc/tests/BaseDwarfTestCase.java
@@ -21,12 +21,10 @@ import java.util.ArrayList; import java.util.List; -import org.eclipse.cdt.debug.edc.internal.services.dsf.Symbols; import org.eclipse.cdt.debug.edc.symbols.ICompileUnitScope; import org.eclipse.cdt.debug.edc.symbols.IEDCSymbolReader; import org.eclipse.cdt.debug.edc.symbols.IScope; import org.eclipse.core.runtime.IPath; -import org.junit.After; import org.junit.Assert; /** @@ -57,9 +55,5 @@ } return scopes; } - - @After - public void tearDown() throws Exception { - Symbols.shutdown(); - } + }
diff --git a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Symbols.java b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Symbols.java index ffd260c..f57011f 100644 --- a/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Symbols.java +++ b/org.eclipse.cdt.debug.edc/src/org/eclipse/cdt/debug/edc/internal/services/dsf/Symbols.java
@@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.cdt.debug.edc.internal.services.dsf; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -52,7 +53,7 @@ /** TEMPORARY system property (value "true", default "false") for selecting the old DWARF reader */ public static final String DWARF_USE_OLD_READER = "dwarf.use_old_reader"; //$NON-NLS-1$ - private static Map<IPath, IEDCSymbolReader> readerCache = new HashMap<IPath, IEDCSymbolReader>(); + private static Map<IPath, WeakReference<IEDCSymbolReader>> readerCache = new HashMap<IPath, WeakReference<IEDCSymbolReader>>(); private ISourceLocator sourceLocator; public ISourceLocator getSourceLocator() { @@ -182,7 +183,11 @@ public static IEDCSymbolReader getSymbolReader(IPath modulePath) { - IEDCSymbolReader reader = readerCache.get(modulePath); + IEDCSymbolReader reader = null; + WeakReference<IEDCSymbolReader> cacheEntry = readerCache.get(modulePath); + + if (cacheEntry != null) + reader = cacheEntry.get(); if (reader != null) { if (reader.getSymbolFile() != null @@ -192,7 +197,7 @@ } // it's been deleted or modified. remove it from the cache - readerCache.remove(reader); + readerCache.remove(modulePath); } IExecutableSymbolicsReader exeReader = ExecutableSymbolicsReaderFactory.createFor(modulePath); @@ -209,7 +214,7 @@ } if (reader != null) { - readerCache.put(modulePath, reader); + readerCache.put(modulePath, new WeakReference<IEDCSymbolReader>(reader)); } return reader; @@ -217,27 +222,10 @@ @Override public void shutdown(RequestMonitor rm) { - // Shutdown all readers when this service is shutdown. This is overkill - // and will cause problems when more then one debug sessions is running, - // but is an temporary measure until we do some more work on the - // readers. - shutdown(); - super.shutdown(rm); } /** - * This is exposed only for testing. - */ - public static void shutdown() { - Collection<IEDCSymbolReader> readers = readerCache.values(); - for (IEDCSymbolReader reader : readers) { - reader.shutDown(); - } - readerCache.clear(); - } - - /** * A wrapper method that calls into symbol reader to get runtime address(es) * for a given function name. * Currently this method use symbol table instead of debug info (e.g. dwarf2)