From 2d2311a2a6a83b657f0c35c5e2aec6a49ca4e43a Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Sat, 23 Jul 2011 08:13:57 -0400 Subject: [PATCH] Use WeakHashMap to keep LSE lists in common pool. --- .../LanguageSettingsSerializable.java | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializable.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializable.java index da29eb269b8..ccd1770bcdd 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializable.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializable.java @@ -26,6 +26,7 @@ import org.eclipse.cdt.core.settings.model.ICSettingEntry; import org.eclipse.cdt.core.settings.model.util.CDataUtil; import org.eclipse.cdt.core.settings.model.util.LanguageSettingEntriesSerializer; import org.eclipse.cdt.internal.core.XmlUtil; +import org.eclipse.cdt.internal.core.parser.util.WeakHashSet; import org.eclipse.core.resources.IResource; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -50,6 +51,14 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { private static final String ELEM_FLAG = "flag"; //$NON-NLS-1$ + private static WeakHashSet> listLSEPool = new WeakHashSet>() { + @Override + public synchronized List add(List list) { + return super.add(list); + } + + }; + private Map>(); fStorage.put(languageId, langMap); } - List sortedEntries = sortEntries(entries); + List sortedEntries = listLSEPool.add(Collections.unmodifiableList(sortEntries(entries))); langMap.put(rcProjectPath, sortedEntries); } else { // do not keep nulls in the tables @@ -152,7 +161,7 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { return sortedEntries; } - + /** * Sets language settings entries for the provider. * Note that the entries are not persisted at that point. To persist use TODO @@ -170,6 +179,8 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { /** * {@inheritDoc} + * + * Note that this list is unmodifiable. */ @Override public List getSettingEntries(ICConfigurationDescription cfgDescription, IResource rc, String languageId) { @@ -178,7 +189,7 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { String rcProjectPath = rc!=null ? rc.getProjectRelativePath().toString() : null; List entries = langMap.get(rcProjectPath); if (entries!=null) - return Collections.unmodifiableList(entries); + return entries; } if (languageId!=null && (languageScope==null || languageScope.contains(languageId))) { @@ -408,8 +419,8 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { for (Entry> entryRc : entrySetRc) { String rcProjectPath = entryRc.getKey(); List lsEntries = entryRc.getValue(); - List lsEntriesClone = new ArrayList(lsEntries); - mapRcClone.put(rcProjectPath, lsEntriesClone); + // don't need to clone entries, they are from the pool + mapRcClone.put(rcProjectPath, lsEntries); } // mapLangClone.put(langId, mapRcClone); storageClone.put(langId, mapRcClone);