From fc34a9ccbf8d7c56a785ae70541055069f0829ec Mon Sep 17 00:00:00 2001 From: Andrew Ferguson Date: Wed, 28 Feb 2007 17:37:24 +0000 Subject: [PATCH] fix locking bug --- .../export/ExternalExportProjectProvider.java | 72 +++++++++---------- .../cdt/internal/core/pdom/PDOMManager.java | 3 +- .../core/pdom/export/GeneratePDOM.java | 11 ++- .../pdom/export/GeneratePDOMApplication.java | 2 +- 4 files changed, 43 insertions(+), 45 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/export/ExternalExportProjectProvider.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/export/ExternalExportProjectProvider.java index 26c1cac4789..603b733b5ad 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/export/ExternalExportProjectProvider.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/export/ExternalExportProjectProvider.java @@ -61,37 +61,37 @@ public class ExternalExportProjectProvider extends AbstractExportProjectProvider protected static final String ARG_SOURCE = "-source"; //$NON-NLS-1$ protected static final String ARG_INCLUDE = "-include"; //$NON-NLS-1$ protected static final String ARG_FRAGMENT_ID = "-id"; //$NON-NLS-1$ - + private IFolder content; private String fragmentId; - + public ExternalExportProjectProvider() { super(); } - + /* * (non-Javadoc) * @see org.eclipse.cdt.core.index.export.IProjectForExportManager#createProject(java.util.Map) */ public ICProject createProject() throws CoreException { - // -source - File source= new File(getSingleString(ARG_SOURCE)); - if(!source.exists()) { - fail(MessageFormat.format(Messages.ExternalContentPEM_LocationToIndexNonExistent, new Object[] {source})); - } - - // -include - List includeFiles= new ArrayList(); - if(isPresent(ARG_INCLUDE)) { - includeFiles.addAll(getParameters(ARG_INCLUDE)); - } - - // -id - fragmentId= getSingleString(ARG_FRAGMENT_ID); - - return createCProject("__"+System.currentTimeMillis(), source, IPDOMManager.ID_FAST_INDEXER, includeFiles); //$NON-NLS-1$ + // -source + File source= new File(getSingleString(ARG_SOURCE)); + if(!source.exists()) { + fail(MessageFormat.format(Messages.ExternalContentPEM_LocationToIndexNonExistent, new Object[] {source})); + } + + // -include + List includeFiles= new ArrayList(); + if(isPresent(ARG_INCLUDE)) { + includeFiles.addAll(getParameters(ARG_INCLUDE)); + } + + // -id + fragmentId= getSingleString(ARG_FRAGMENT_ID); + + return createCProject("__"+System.currentTimeMillis(), source, IPDOMManager.ID_FAST_INDEXER, includeFiles); //$NON-NLS-1$ } - + /** * Returns the project folder the external content is stored in * @return the project folder the external content is stored in @@ -99,7 +99,7 @@ public class ExternalExportProjectProvider extends AbstractExportProjectProvider protected IFolder getContentFolder() { return content; } - + /** * Convenience method for creating a cproject * @param projectName the name for the new project @@ -114,14 +114,14 @@ public class ExternalExportProjectProvider extends AbstractExportProjectProvider final File location, final String indexerID, final List includeFiles - ) throws CoreException { + ) throws CoreException { final IWorkspace ws = ResourcesPlugin.getWorkspace(); final ICProject newProject[] = new ICProject[1]; - + ws.run(new IWorkspaceRunnable() { public void run(IProgressMonitor monitor) throws CoreException { IWorkspaceRoot root = ws.getRoot(); - + IProject project = root.getProject(projectName); if (!project.exists()) { project.create(NPM); @@ -137,13 +137,13 @@ public class ExternalExportProjectProvider extends AbstractExportProjectProvider if (!project.hasNature(CCProjectNature.CC_NATURE_ID)) { addNatureToProject(project, CCProjectNature.CC_NATURE_ID, NPM); } - + ICProject cproject = CCorePlugin.getDefault().getCoreModel().create(project); - + // External content appears under a linked folder content= cproject.getProject().getFolder(CONTENT); content.createLink(new Path(location.getAbsolutePath()), IResource.NONE, null); - + // Setup path entries List entries= new ArrayList(Arrays.asList(CoreModel.getRawPathEntries(cproject))); for(Iterator j= includeFiles.iterator(); j.hasNext(); ) { @@ -151,14 +151,14 @@ public class ExternalExportProjectProvider extends AbstractExportProjectProvider CoreModel.newIncludeFileEntry( cproject.getProject().getFullPath(), new Path((String) j.next()) - )); + )); } entries.add(CoreModel.newSourceEntry(content.getProjectRelativePath())); cproject.setRawPathEntries( - (IPathEntry[]) entries.toArray(new IPathEntry[includeFiles.size()]), - new NullProgressMonitor() + (IPathEntry[]) entries.toArray(new IPathEntry[includeFiles.size()]), + new NullProgressMonitor() ); - + newProject[0]= cproject; } }, null); @@ -167,10 +167,10 @@ public class ExternalExportProjectProvider extends AbstractExportProjectProvider IndexerPreferences.set(newProject[0].getProject(), IndexerPreferences.KEY_INDEX_ALL_FILES, Boolean.TRUE.toString()); IndexerPreferences.set(newProject[0].getProject(), IndexerPreferences.KEY_INDEXER_ID, indexerID); } - + return newProject[0]; } - + /* * This should be a platform/CDT API */ @@ -183,8 +183,8 @@ public class ExternalExportProjectProvider extends AbstractExportProjectProvider description.setNatureIds(newNatures); proj.setDescription(description, monitor); } - - + + /* * (non-Javadoc) * @see org.eclipse.cdt.core.index.export.IExportProjectProvider#getLocationConverter(org.eclipse.cdt.core.model.ICProject) @@ -192,7 +192,7 @@ public class ExternalExportProjectProvider extends AbstractExportProjectProvider public IIndexLocationConverter getLocationConverter(final ICProject cproject) { return new ResourceContainerRelativeLocationConverter(content); } - + /* * (non-Javadoc) * @see org.eclipse.cdt.core.index.export.IExportProjectProvider#getExportProperties() diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java index 91813fc4a61..cfa176792b4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java @@ -718,8 +718,7 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen * Exports the project PDOM to the specified location, rewriting locations with * the specified location converter. *
- * Note. this method does not acquire or release any locks. It is expected - * that this will be done by the caller. + * Note. This will acquire a write lock while the pdom is exported * @param targetLocation a location that does not currently exist * @param newConverter * @throws CoreException diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/export/GeneratePDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/export/GeneratePDOM.java index 71b4ce5a023..d6c4eb92230 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/export/GeneratePDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/export/GeneratePDOM.java @@ -20,7 +20,6 @@ import org.eclipse.cdt.core.index.IIndexLocationConverter; import org.eclipse.cdt.core.index.export.IExportProjectProvider; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.CCoreInternals; -import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.WritablePDOM; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.ISafeRunnable; @@ -54,11 +53,11 @@ public class GeneratePDOM implements ISafeRunnable { CCorePlugin.getIndexManager().joinIndexer(Integer.MAX_VALUE, new NullProgressMonitor()); IIndexLocationConverter converter= pm.getLocationConverter(cproject); try { - PDOM pdom = (PDOM) CCoreInternals.getPDOMManager().getPDOM(cproject); - pdom.acquireWriteLock(0); + CCoreInternals.getPDOMManager().exportProjectPDOM(cproject, targetLocation, converter); + WritablePDOM exportedPDOM= new WritablePDOM(targetLocation, converter); + + exportedPDOM.acquireWriteLock(0); try { - CCoreInternals.getPDOMManager().exportProjectPDOM(cproject, targetLocation, converter); - WritablePDOM exportedPDOM= new WritablePDOM(targetLocation, converter); Map exportProperties= pm.getExportProperties(); if(exportProperties!=null) { for(Iterator i = exportProperties.entrySet().iterator(); i.hasNext(); ) { @@ -67,7 +66,7 @@ public class GeneratePDOM implements ISafeRunnable { } } } finally { - pdom.releaseWriteLock(0); + exportedPDOM.releaseWriteLock(0); } } catch(InterruptedException ie) { String msg= MessageFormat.format(Messages.GeneratePDOM_GenericGenerationFailed, new Object[] {ie.getMessage()}); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/export/GeneratePDOMApplication.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/export/GeneratePDOMApplication.java index ae9c455d520..11ca4246610 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/export/GeneratePDOMApplication.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/export/GeneratePDOMApplication.java @@ -188,7 +188,7 @@ public class GeneratePDOMApplication implements IApplication { worked += work; int pc = totalWork<1 ? 0 : (int) ((worked*100D)/totalWork); if(shouldOutput()) { - writer.println(pc+"% "+subTask+" "+worked+" "+totalWork); //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$ + writer.println(pc+"% "+subTask); //$NON-NLS-1$ } } }