1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-01 06:05:24 +02:00

Bug 312552 Use ILock rather than scheduling rule for mutual exclusion. Scheduling rules require knowing in advance all scheduling rules clients require.

This commit is contained in:
James Blackburn 2010-05-12 09:28:03 +00:00
parent 18f0684dd3
commit 7b265afa4e

View file

@ -60,7 +60,8 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor; 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 { public class CfgDiscoveredPathManager implements IResourceChangeListener {
@ -69,39 +70,9 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener {
private IDiscoveredPathManager fBaseMngr; 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 { private static class ContextInfo {
public ContextInfo() { public ContextInfo() {
@ -196,16 +167,17 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener {
PathInfo info = getCachedPathInfo(cInfo); PathInfo info = getCachedPathInfo(cInfo);
if (info == null) { if (info == null) {
// Change synchronization to be a lock on the project, otherwise try {
// if the project description is queried from a project change listener, it will deadlock lock.acquire();
info = getCachedPathInfo(cInfo);
GetDiscoveredInfoRunnable runnable = new GetDiscoveredInfoRunnable(cInfo, project, context);
ISchedulingRule rule = project;
ResourcesPlugin.getWorkspace().run(runnable, rule, IWorkspace.AVOID_UPDATE, null);
info = runnable.getPathInfo();
if(info == null){
IDiscoveredPathManager.IDiscoveredPathInfo baseInfo = loadPathInfo(project, context.getConfiguration(), cInfo);
info = resolveCacheBaseDiscoveredInfo(cInfo, baseInfo);
}
} finally {
lock.release();
}
} }
return info; return info;
} }