1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-08 10:16:03 +02:00

Fix and test for 196290: Deadlock during project creation

This commit is contained in:
Anton Leherbauer 2007-07-12 12:05:42 +00:00
parent 37107e83e1
commit 5894ebf4d9
2 changed files with 40 additions and 18 deletions

View file

@ -12,8 +12,6 @@
package org.eclipse.cdt.core.cdescriptor.tests; package org.eclipse.cdt.core.cdescriptor.tests;
import java.util.Iterator;
import junit.extensions.TestSetup; import junit.extensions.TestSetup;
import junit.framework.Assert; import junit.framework.Assert;
import junit.framework.Test; import junit.framework.Test;
@ -28,7 +26,6 @@ import org.eclipse.cdt.core.ICDescriptorListener;
import org.eclipse.cdt.core.ICDescriptorOperation; import org.eclipse.cdt.core.ICDescriptorOperation;
import org.eclipse.cdt.core.ICExtensionReference; import org.eclipse.cdt.core.ICExtensionReference;
import org.eclipse.cdt.core.ICOwnerInfo; import org.eclipse.cdt.core.ICOwnerInfo;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.cdt.core.testplugin.CTestPlugin;
import org.eclipse.cdt.internal.core.pdom.PDOMManager; import org.eclipse.cdt.internal.core.pdom.PDOMManager;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
@ -76,6 +73,7 @@ public class CDescriptorTests extends TestCase {
suite.addTest(new CDescriptorTests("testProjectDataDelete")); suite.addTest(new CDescriptorTests("testProjectDataDelete"));
suite.addTest(new CDescriptorTests("testConcurrentDescriptorCreation")); suite.addTest(new CDescriptorTests("testConcurrentDescriptorCreation"));
suite.addTest(new CDescriptorTests("testConcurrentDescriptorCreation2")); suite.addTest(new CDescriptorTests("testConcurrentDescriptorCreation2"));
suite.addTest(new CDescriptorTests("testDeadlockDuringProjectCreation"));
TestSetup wrapper = new TestSetup(suite) { TestSetup wrapper = new TestSetup(suite) {
@ -178,8 +176,9 @@ public class CDescriptorTests extends TestCase {
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=185930 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=185930
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=193503 // https://bugs.eclipse.org/bugs/show_bug.cgi?id=193503
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=196118
public void testConcurrentDescriptorCreation2() throws Exception { public void testConcurrentDescriptorCreation2() throws Exception {
for (int i=0; i<100; ++i) { for (int i=0; i<20; ++i) {
PDOMManager pdomMgr= (PDOMManager)CCorePlugin.getIndexManager(); PDOMManager pdomMgr= (PDOMManager)CCorePlugin.getIndexManager();
pdomMgr.shutdown(); pdomMgr.shutdown();
fProject.close(null); fProject.close(null);
@ -233,6 +232,33 @@ public class CDescriptorTests extends TestCase {
} }
} }
public void testDeadlockDuringProjectCreation() throws Exception {
for (int i=0; i < 10; ++i) {
oneTimeTearDown();
oneTimeSetUp();
Thread t= new Thread() {
public void run() {
try {
ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(fProject, true);
Element data = desc.getProjectData("testElement0");
data.appendChild(data.getOwnerDocument().createElement("test"));
desc.saveProjectData();
} catch (CoreException exc) {
}
}
};
t.start();
ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(fProject, true);
Element data = desc.getProjectData("testElement0");
data.appendChild(data.getOwnerDocument().createElement("test"));
desc.saveProjectData();
t.join();
fLastEvent = null;
}
}
public void testDescriptorOwner() throws Exception { public void testDescriptorOwner() throws Exception {
ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(fProject, true); ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(fProject, true);
ICOwnerInfo owner = desc.getProjectOwner(); ICOwnerInfo owner = desc.getProjectOwner();

View file

@ -124,7 +124,6 @@ public class CConfigBasedDescriptor implements ICDescriptor {
} }
private void checkApply() throws CoreException { private void checkApply() throws CoreException {
synchronized (CProjectDescriptionManager.getInstance()){
if(fApplyOnChange){ if(fApplyOnChange){
apply(false); apply(false);
fIsDirty = false; fIsDirty = false;
@ -132,7 +131,6 @@ public class CConfigBasedDescriptor implements ICDescriptor {
fIsDirty = true; fIsDirty = true;
} }
} }
}
public ICExtensionReference create(String extensionPoint, String id) public ICExtensionReference create(String extensionPoint, String id)
throws CoreException { throws CoreException {
@ -323,13 +321,11 @@ public class CConfigBasedDescriptor implements ICDescriptor {
} }
public void saveProjectData() throws CoreException { public void saveProjectData() throws CoreException {
synchronized (CProjectDescriptionManager.getInstance()) {
if(CProjectDescriptionManager.getInstance().getDescriptorManager().reconsile(this, fCfgDes.getProjectDescription())) if(CProjectDescriptionManager.getInstance().getDescriptorManager().reconsile(this, fCfgDes.getProjectDescription()))
fIsDirty = true; fIsDirty = true;
checkApply(); checkApply();
} }
}
public Map getStorageDataElMap(){ public Map getStorageDataElMap(){
return (HashMap)fStorageDataElMap.clone(); return (HashMap)fStorageDataElMap.clone();