From 78e2f65d6d91ed54b86f424b9d6a73c31886ca1f Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 4 Jan 2010 09:14:27 +0000 Subject: [PATCH] Bug 297641: Result cache of read-only fragments is not cleared. --- .../cdt/internal/index/tests/EmptyIndexFragment.java | 3 +++ .../parser/org/eclipse/cdt/internal/core/index/CIndex.java | 6 ++++++ .../org/eclipse/cdt/internal/core/index/IIndexFragment.java | 5 +++++ .../org/eclipse/cdt/internal/core/index/WritableCIndex.java | 3 +++ .../parser/org/eclipse/cdt/internal/core/pdom/PDOM.java | 2 +- .../org/eclipse/cdt/internal/core/pdom/PDOMProxy.java | 4 ++++ 6 files changed, 22 insertions(+), 1 deletion(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/EmptyIndexFragment.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/EmptyIndexFragment.java index 78a6dbb3f8c..eb1aec237a2 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/EmptyIndexFragment.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/EmptyIndexFragment.java @@ -139,4 +139,7 @@ public class EmptyIndexFragment implements IIndexFragment { public Object putCachedResult(Object key, Object value, boolean replace) { return value; } + + public void clearResultCache() { + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java index 3ad39900800..c3c0844d523 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java @@ -614,6 +614,12 @@ public class CIndex implements IIndex { } } + void clearResultCaches() { + for (IIndexFragment frag : fFragments) { + frag.clearResultCache(); + } + } + public IIndexFileSet createFileSet() { return new IndexFileSet(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java index 1b3a9b8a375..50d35af6e28 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java @@ -273,4 +273,9 @@ public interface IIndexFragment { * longer holds a locks. */ Object getCachedResult(Object key); + + /** + * Clears the result cache. + */ + void clearResultCache(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java index e63096d1b38..1cca94dbdd6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java @@ -122,6 +122,9 @@ public class WritableCIndex extends CIndex implements IWritableIndex { fIsWriteLocked= false; fWritableFragment.releaseWriteLock(establishReadlockCount, flush); + + // Bug 297641: Result cache of read only providers needs to be cleared. + clearResultCaches(); } public void flush() throws CoreException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 32028290a1f..b878dc887e4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -1145,7 +1145,7 @@ public class PDOM extends PlatformObject implements IPDOM { clearResultCache(); } - private void clearResultCache() { + public void clearResultCache() { synchronized (fResultCache) { fResultCache.clear(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMProxy.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMProxy.java index b2c4bc65d25..e1cabeb4403 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMProxy.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMProxy.java @@ -274,4 +274,8 @@ public class PDOMProxy implements IPDOM { public Object putCachedResult(Object key, Object value, boolean replace) { return value; } + public void clearResultCache() { + if (fDelegate != null) + fDelegate.clearResultCache(); + } }