From 2aa55cf930afa94cecf980f31e556af00aae71c5 Mon Sep 17 00:00:00 2001 From: Oleg Krasilnikov Date: Thu, 14 Feb 2008 11:50:41 +0000 Subject: [PATCH] Bug #216996: deadlock --- .../core/CConfigBasedDescriptorManager.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptorManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptorManager.java index 5abbf64de11..e2f77ca8144 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptorManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptorManager.java @@ -52,6 +52,8 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.ILock; +import org.eclipse.core.runtime.jobs.Job; import org.w3c.dom.Element; public class CConfigBasedDescriptorManager implements ICDescriptorManager { @@ -194,11 +196,21 @@ public class CConfigBasedDescriptorManager implements ICDescriptorManager { return getDescriptor(project, true); } + private ILock fInstanceLock = Job.getJobManager().newLock(); + public ICDescriptor getDescriptor(IProject project, boolean create) throws CoreException { - synchronized (CProjectDescriptionManager.getInstance()) { + if (create) { + synchronized (CProjectDescriptionManager.getInstance()) { + try { + fInstanceLock.acquire(); + return findDescriptor(project, create); + } finally { + fInstanceLock.release(); + } + } + } else // no need to synchronize in this case. return findDescriptor(project, create); - } } public void addDescriptorListener(ICDescriptorListener listener) {