From 5894ebf4d9834dfaba435dfefe9acfc6f83d54d4 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Thu, 12 Jul 2007 12:05:42 +0000 Subject: [PATCH] Fix and test for 196290: Deadlock during project creation --- .../cdescriptor/tests/CDescriptorTests.java | 36 ++++++++++++++++--- .../internal/core/CConfigBasedDescriptor.java | 22 +++++------- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/cdescriptor/tests/CDescriptorTests.java b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/cdescriptor/tests/CDescriptorTests.java index bafdfaf3c65..c99d2d30f61 100644 --- a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/cdescriptor/tests/CDescriptorTests.java +++ b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/cdescriptor/tests/CDescriptorTests.java @@ -12,8 +12,6 @@ package org.eclipse.cdt.core.cdescriptor.tests; -import java.util.Iterator; - import junit.extensions.TestSetup; import junit.framework.Assert; 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.ICExtensionReference; import org.eclipse.cdt.core.ICOwnerInfo; -import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.cdt.internal.core.pdom.PDOMManager; import org.eclipse.core.resources.IProject; @@ -76,7 +73,8 @@ public class CDescriptorTests extends TestCase { suite.addTest(new CDescriptorTests("testProjectDataDelete")); suite.addTest(new CDescriptorTests("testConcurrentDescriptorCreation")); suite.addTest(new CDescriptorTests("testConcurrentDescriptorCreation2")); - + suite.addTest(new CDescriptorTests("testDeadlockDuringProjectCreation")); + TestSetup wrapper = new TestSetup(suite) { protected void setUp() throws Exception { @@ -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=193503 + // https://bugs.eclipse.org/bugs/show_bug.cgi?id=196118 public void testConcurrentDescriptorCreation2() throws Exception { - for (int i=0; i<100; ++i) { + for (int i=0; i<20; ++i) { PDOMManager pdomMgr= (PDOMManager)CCorePlugin.getIndexManager(); pdomMgr.shutdown(); 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 { ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(fProject, true); ICOwnerInfo owner = desc.getProjectOwner(); diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptor.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptor.java index 1dde988d501..f4cbb32accd 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptor.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptor.java @@ -124,13 +124,11 @@ public class CConfigBasedDescriptor implements ICDescriptor { } private void checkApply() throws CoreException { - synchronized (CProjectDescriptionManager.getInstance()){ - if(fApplyOnChange){ - apply(false); - fIsDirty = false; - } else { - fIsDirty = true; - } + if(fApplyOnChange){ + apply(false); + fIsDirty = false; + } else { + fIsDirty = true; } } @@ -323,12 +321,10 @@ public class CConfigBasedDescriptor implements ICDescriptor { } public void saveProjectData() throws CoreException { - synchronized (CProjectDescriptionManager.getInstance()) { - if(CProjectDescriptionManager.getInstance().getDescriptorManager().reconsile(this, fCfgDes.getProjectDescription())) - fIsDirty = true; - - checkApply(); - } + if(CProjectDescriptionManager.getInstance().getDescriptorManager().reconsile(this, fCfgDes.getProjectDescription())) + fIsDirty = true; + + checkApply(); } public Map getStorageDataElMap(){