diff options
Diffstat (limited to 'build')
-rw-r--r-- | build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/CfgDiscoveredPathManager.java | 56 |
1 files changed, 14 insertions, 42 deletions
diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/CfgDiscoveredPathManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/CfgDiscoveredPathManager.java index cd32ab4447f..c4f7d7c9584 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/CfgDiscoveredPathManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/CfgDiscoveredPathManager.java @@ -60,7 +60,8 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.jobs.ISchedulingRule; +import org.eclipse.core.runtime.jobs.ILock; +import org.eclipse.core.runtime.jobs.Job; public class CfgDiscoveredPathManager implements IResourceChangeListener { @@ -69,39 +70,9 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { private IDiscoveredPathManager fBaseMngr; + /** Deadlock-safe mutex lock */ + private ILock lock = Job.getJobManager().newLock(); - private class GetDiscoveredInfoRunnable implements IWorkspaceRunnable { - - private PathInfo fPathInfo; - private ContextInfo fContextInfo; - private IProject fProject; - private CfgInfoContext fContext; - - public GetDiscoveredInfoRunnable(ContextInfo cInfo, IProject project, CfgInfoContext context) { - fContextInfo = cInfo; - fProject = project; - fContext = context; - } - - public void run(IProgressMonitor monitor) throws CoreException { - - fPathInfo = getCachedPathInfo(fContextInfo); - - if(fPathInfo == null){ - IDiscoveredPathManager.IDiscoveredPathInfo baseInfo = loadPathInfo(fProject, fContext.getConfiguration(), fContextInfo); - - fPathInfo = resolveCacheBaseDiscoveredInfo(fContextInfo, baseInfo); - } - - } - - public PathInfo getPathInfo() { - return fPathInfo; - } - - }; - - private static class ContextInfo { public ContextInfo() { @@ -196,16 +167,17 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { PathInfo info = getCachedPathInfo(cInfo); if (info == null) { - // Change synchronization to be a lock on the project, otherwise - // if the project description is queried from a project change listener, it will deadlock - - GetDiscoveredInfoRunnable runnable = new GetDiscoveredInfoRunnable(cInfo, project, context); - ISchedulingRule rule = project; - - ResourcesPlugin.getWorkspace().run(runnable, rule, IWorkspace.AVOID_UPDATE, null); - - info = runnable.getPathInfo(); + try { + lock.acquire(); + info = getCachedPathInfo(cInfo); + if(info == null){ + IDiscoveredPathManager.IDiscoveredPathInfo baseInfo = loadPathInfo(project, context.getConfiguration(), cInfo); + info = resolveCacheBaseDiscoveredInfo(cInfo, baseInfo); + } + } finally { + lock.release(); + } } return info; } |