From bb895064cf537fd3e8219a5831e534e25ce20ecf Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 28 Mar 2007 11:04:13 +0000 Subject: [PATCH] Fix for 178995, handling of PDOMProperties --- .../cdt/internal/pdom/tests/PDOMBugsTest.java | 19 +++++++----- .../internal/core/index/IWritableIndex.java | 6 ++++ .../internal/core/index/WritableCIndex.java | 6 +++- .../core/pdom/indexer/PDOMRebuildTask.java | 29 ++++--------------- 4 files changed, 27 insertions(+), 33 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMBugsTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMBugsTest.java index 2500f55f1a9..086b9ec3550 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMBugsTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/PDOMBugsTest.java @@ -25,6 +25,7 @@ import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.index.IIndexFragment; import org.eclipse.cdt.internal.core.index.IWritableIndexFragment; import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.cdt.internal.core.pdom.PDOMManager; import org.eclipse.cdt.internal.core.pdom.WritablePDOM; import org.eclipse.cdt.internal.core.pdom.db.ChunkCache; import org.eclipse.core.resources.IResource; @@ -91,7 +92,8 @@ public class PDOMBugsTest extends BaseTestCase { File tmp= new File(System.getProperty("java.io.tmpdir")+"/temp"+System.currentTimeMillis()+".pdom"); IIndexLocationConverter cvr= new ResourceContainerRelativeLocationConverter(cproject.getProject()); - CCoreInternals.getPDOMManager().exportProjectPDOM(cproject, tmp, cvr); + final PDOMManager pdomManager = CCoreInternals.getPDOMManager(); + pdomManager.exportProjectPDOM(cproject, tmp, cvr); IWritableIndexFragment pdom = new WritablePDOM(tmp, cvr, new ChunkCache()); pdom.acquireReadLock(); @@ -99,19 +101,20 @@ public class PDOMBugsTest extends BaseTestCase { String id= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); assertNotNull("Exported pdom ID is null", id); - String id2= ((PDOM)CCoreInternals.getPDOMManager().getPDOM(cproject)).getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); + String id2= ((PDOM)pdomManager.getPDOM(cproject)).getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); assertNotNull("Project pdom ID is null", id2); assertFalse("Project pdom ID equals export PDOM id", id2.equals(id)); - CCoreInternals.getPDOMManager().reindex(cproject); + pdomManager.reindex(cproject); + assertTrue(pdomManager.joinIndexer(4000, new NullProgressMonitor())); String id3= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); - assertNotNull("Reindexed project pdom ID is null", id3); - assertEquals("Reindexex project pdom ID equals exported pdom ID", id, id3); + assertNotNull("Exported pdom ID is null after project reindex", id3); + assertEquals("Exported pdom ID hasChanged during reindex", id, id3); - String id4= ((PDOM)CCoreInternals.getPDOMManager().getPDOM(cproject)).getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); - assertNotNull("Exported pdom ID is null after project reindex", id4); - assertFalse("Exported pdom ID equals project pdom ID after reindex", id4.equals(id)); + String id4= ((PDOM)pdomManager.getPDOM(cproject)).getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); + assertNotNull("Reindexed project pdom ID is null", id4); + assertFalse("Reindexex project pdom ID equals exported pdom ID", id4.equals(id)); } finally { pdom.releaseReadLock(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndex.java index 6433fcdb764..3ec9b74d083 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndex.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndex.java @@ -73,4 +73,10 @@ public interface IWritableIndex extends IIndex { * Returns cache misses since last reset of counters. */ long getCacheMisses(); + + /** + * Returns the primary writable fragment, or null if there is + * no writable fragment. + */ + IWritableIndexFragment getPrimaryWritableFragment(); } 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 8661ed376f1..e173234249d 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006 Wind River Systems, Inc. and others. + * Copyright (c) 2006, 2007 Wind River Systems, Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -128,4 +128,8 @@ public class WritableCIndex extends CIndex implements IWritableIndex { fWritableFragments[i].releaseWriteLock(establishReadlockCount); } } + + public IWritableIndexFragment getPrimaryWritableFragment() { + return fWritableFragments.length > 0 ? fWritableFragments[0] : null; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMRebuildTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMRebuildTask.java index 34383f4adde..ff3205fb389 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMRebuildTask.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/PDOMRebuildTask.java @@ -20,8 +20,8 @@ import org.eclipse.cdt.core.dom.IPDOMIndexerTask; import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ITranslationUnit; -import org.eclipse.cdt.internal.core.CCoreInternals; import org.eclipse.cdt.internal.core.index.IWritableIndex; +import org.eclipse.cdt.internal.core.index.IWritableIndexFragment; import org.eclipse.cdt.internal.core.index.IWritableIndexManager; import org.eclipse.cdt.internal.core.pdom.IndexerProgress; import org.eclipse.cdt.internal.core.pdom.PDOMManager; @@ -78,38 +78,19 @@ public class PDOMRebuildTask implements IPDOMIndexerTask { if (fDelegate != null) { fDelegate.run(monitor); - writeProjectProperties(project); } } - /** - * Writes project metadata to the pdom - * @see PDOMManager#writeProjectPDOMProperties(WritablePDOM, org.eclipse.core.resources.IProject) - * @param project the project to write project metadata about - */ - private void writeProjectProperties(ICProject project) { - try { - PDOMManager mgr= CCoreInternals.getPDOMManager(); - WritablePDOM projectPDOM= (WritablePDOM) mgr.getPDOM(project); - projectPDOM.acquireWriteLock(); - try { - PDOMManager.writeProjectPDOMProperties(projectPDOM, project.getProject()); - } finally { - projectPDOM.releaseWriteLock(); - } - } catch(CoreException ce) { - CCorePlugin.log(ce); - } catch(InterruptedException ie) { - // no-op - } - } - private void clearIndex(ICProject project) throws CoreException, InterruptedException { IWritableIndex index= ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(project); // First clear the pdom index.acquireWriteLock(0); try { index.clear(); + IWritableIndexFragment wf= index.getPrimaryWritableFragment(); + if (wf instanceof WritablePDOM) { + PDOMManager.writeProjectPDOMProperties((WritablePDOM) wf, project.getProject()); + } } finally { index.releaseWriteLock(0);