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)