mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Fixes race condition, by Andrew Ferguson, bug 157992.
This commit is contained in:
parent
4c2b2120e4
commit
6d85d8d0b9
1 changed files with 35 additions and 41 deletions
|
@ -9,6 +9,7 @@
|
||||||
* QNX - Initial API and implementation
|
* QNX - Initial API and implementation
|
||||||
* Markus Schorn (Wind River Systems)
|
* Markus Schorn (Wind River Systems)
|
||||||
* IBM Corporation
|
* IBM Corporation
|
||||||
|
* Symbian - Fix a race condition (157992)
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.internal.pdom.tests;
|
package org.eclipse.cdt.internal.pdom.tests;
|
||||||
|
|
||||||
|
@ -17,25 +18,21 @@ import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCProjectNature;
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.CProjectNature;
|
|
||||||
import org.eclipse.cdt.core.dom.IName;
|
import org.eclipse.cdt.core.dom.IName;
|
||||||
|
import org.eclipse.cdt.core.dom.IPDOMIndexer;
|
||||||
|
import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
|
||||||
import org.eclipse.cdt.core.dom.IPDOMManager;
|
import org.eclipse.cdt.core.dom.IPDOMManager;
|
||||||
import org.eclipse.cdt.core.dom.ast.IBinding;
|
import org.eclipse.cdt.core.dom.ast.IBinding;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember;
|
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMember;
|
||||||
import org.eclipse.cdt.core.index.IndexFilter;
|
import org.eclipse.cdt.core.index.IndexFilter;
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
|
import org.eclipse.cdt.core.testplugin.CProjectHelper;
|
||||||
import org.eclipse.cdt.core.testplugin.CTestPlugin;
|
import org.eclipse.cdt.core.testplugin.CTestPlugin;
|
||||||
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
|
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
|
||||||
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
|
import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
|
||||||
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
import org.eclipse.cdt.internal.core.index.IIndexFragment;
|
||||||
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
import org.eclipse.cdt.internal.core.pdom.PDOM;
|
||||||
import org.eclipse.cdt.internal.core.pdom.indexer.fast.PDOMFastIndexer;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.indexer.fast.PDOMFastReindex;
|
|
||||||
import org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer;
|
|
||||||
import org.eclipse.core.resources.IProject;
|
|
||||||
import org.eclipse.core.resources.IProjectDescription;
|
|
||||||
import org.eclipse.core.resources.IWorkspace;
|
import org.eclipse.core.resources.IWorkspace;
|
||||||
import org.eclipse.core.resources.IWorkspaceRunnable;
|
import org.eclipse.core.resources.IWorkspaceRunnable;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
@ -69,31 +66,14 @@ public class PDOMTestBase extends BaseTestCase {
|
||||||
final ICProject cprojects[] = new ICProject[1];
|
final ICProject cprojects[] = new ICProject[1];
|
||||||
workspace.run(new IWorkspaceRunnable() {
|
workspace.run(new IWorkspaceRunnable() {
|
||||||
public void run(IProgressMonitor monitor) throws CoreException {
|
public void run(IProgressMonitor monitor) throws CoreException {
|
||||||
IPDOMManager manager = CCorePlugin.getPDOMManager();
|
|
||||||
// Make sure the default is no indexer
|
|
||||||
String oldDefault = manager.getDefaultIndexerId();
|
|
||||||
if (!PDOMNullIndexer.ID.equals(oldDefault))
|
|
||||||
manager.setDefaultIndexerId(PDOMNullIndexer.ID);
|
|
||||||
else
|
|
||||||
oldDefault = null;
|
|
||||||
|
|
||||||
// Create the project
|
// Create the project
|
||||||
IProject project = workspace.getRoot().getProject(projectName);
|
ICProject cproject= CProjectHelper.createCProject(projectName, null);
|
||||||
project.create(monitor);
|
|
||||||
project.open(monitor);
|
|
||||||
|
|
||||||
// Set up as C++ project
|
// Set the indexer to the null indexer and invoke it later on.
|
||||||
IProjectDescription description = project.getDescription();
|
CCorePlugin.getPDOMManager().setIndexerId(cproject, IPDOMManager.ID_NO_INDEXER);
|
||||||
String[] prevNatures = description.getNatureIds();
|
|
||||||
String[] newNatures = new String[prevNatures.length + 2];
|
|
||||||
System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length);
|
|
||||||
newNatures[prevNatures.length] = CProjectNature.C_NATURE_ID;
|
|
||||||
newNatures[prevNatures.length + 1] = CCProjectNature.CC_NATURE_ID;
|
|
||||||
description.setNatureIds(newNatures);
|
|
||||||
project.setDescription(description, monitor);
|
|
||||||
|
|
||||||
// Import the files at the root
|
// Import the files at the root
|
||||||
ImportOperation importOp = new ImportOperation(project.getFullPath(),
|
ImportOperation importOp = new ImportOperation(cproject.getProject().getFullPath(),
|
||||||
rootDir, FileSystemStructureProvider.INSTANCE, new IOverwriteQuery() {
|
rootDir, FileSystemStructureProvider.INSTANCE, new IOverwriteQuery() {
|
||||||
public String queryOverwrite(String pathString) {
|
public String queryOverwrite(String pathString) {
|
||||||
return IOverwriteQuery.ALL;
|
return IOverwriteQuery.ALL;
|
||||||
|
@ -103,21 +83,35 @@ public class PDOMTestBase extends BaseTestCase {
|
||||||
try {
|
try {
|
||||||
importOp.run(monitor);
|
importOp.run(monitor);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new CoreException(new Status(IStatus.ERROR,
|
throw new CoreException(new Status(IStatus.ERROR, CTestPlugin.PLUGIN_ID, 0, "Import Interrupted", e));
|
||||||
CTestPlugin.PLUGIN_ID, 0, "Import Interrupted", e));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ICProject cproject = CCorePlugin.getDefault().getCoreModel().create(project);
|
|
||||||
|
|
||||||
// Index the project
|
// Index the project
|
||||||
PDOMFastIndexer indexer = new PDOMFastIndexer();
|
CCorePlugin.getPDOMManager().setIndexerId(cproject, IPDOMManager.ID_FAST_INDEXER);
|
||||||
indexer.setProject(cproject);
|
|
||||||
PDOMFastReindex reindex = new PDOMFastReindex(indexer);
|
|
||||||
reindex.run(monitor);
|
|
||||||
|
|
||||||
// Set the default indexer back
|
// wait until the indexer is done
|
||||||
if (oldDefault != null)
|
final boolean[] indexerDone = new boolean[1];
|
||||||
manager.setDefaultIndexerId(oldDefault);
|
CCorePlugin.getPDOMManager().enqueue(new IPDOMIndexerTask() {
|
||||||
|
public IPDOMIndexer getIndexer() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
public void run(IProgressMonitor monitor) {
|
||||||
|
synchronized(indexerDone) {
|
||||||
|
indexerDone[0] = true;
|
||||||
|
indexerDone.notify();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Join indexer job
|
||||||
|
synchronized(indexerDone) {
|
||||||
|
while(!indexerDone[0])
|
||||||
|
indexerDone.wait();
|
||||||
|
}
|
||||||
|
} catch(InterruptedException ie) {
|
||||||
|
throw new RuntimeException(ie);
|
||||||
|
}
|
||||||
|
|
||||||
cprojects[0] = cproject;
|
cprojects[0] = cproject;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue