diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeTarget.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeTarget.java index 1616ebf75c3..d1c4db44c26 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeTarget.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/MakeTarget.java @@ -333,7 +333,7 @@ public class MakeTarget extends PlatformObject implements IMakeTarget { } }; try { - ResourcesPlugin.getWorkspace().run(op, monitor); + ResourcesPlugin.getWorkspace().run(op, null, IResource.NONE, monitor); } finally { monitor.done(); } diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/TargetBuild.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/TargetBuild.java index 0a804d4a074..e53aa256d64 100644 --- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/TargetBuild.java +++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/TargetBuild.java @@ -18,6 +18,7 @@ import org.eclipse.cdt.make.core.IMakeTarget; import org.eclipse.cdt.make.internal.ui.MakeUIPlugin; import org.eclipse.cdt.make.internal.ui.preferences.MakePreferencePage; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; @@ -100,7 +101,7 @@ public class TargetBuild { target.build(new SubProgressMonitor(monitor, 1)); } }; - MakeUIPlugin.getWorkspace().run(runnable, monitor); + MakeUIPlugin.getWorkspace().run(runnable, null, IResource.NONE, monitor); } } catch (CoreException e) { return e.getStatus(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java index 5fc270eabc0..2e7f41806d1 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java @@ -22,8 +22,8 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; import org.eclipse.cdt.build.core.scannerconfig.CfgInfoContext; import org.eclipse.cdt.build.core.scannerconfig.ICfgScannerConfigBuilderInfo2Set; @@ -2078,4 +2078,30 @@ public class CommonBuilder extends ACBuilder { if (markers != null) { workspace.deleteMarkers(markers); } - }} + } + + /** + * Only lock the workspace is this is a ManagedBuild, or this project references others. + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public ISchedulingRule getRule(int trigger, Map args) { + IResource WR_rule = ResourcesPlugin.getWorkspace().getRoot(); + if (needAllConfigBuild() || !isCdtProjectCreated(getProject())) + return WR_rule; + + // Get the builders to run + IBuilder builders[] = ManagedBuilderCorePlugin.createBuilders(getProject(), args); + // Be pessimistic if we referenced other configs + if (getReferencedConfigs(builders).length > 0) + return WR_rule; + // If any builder isManaged => pessimistic + for (IBuilder builder : builders) { + if (builder.isManagedBuildOn()) + return WR_rule; + } + + // Success! + return null; + } +} diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ACBuilder.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ACBuilder.java index 364aa68f157..d58b1950592 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ACBuilder.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ACBuilder.java @@ -30,6 +30,7 @@ import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Preferences; +import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.osgi.util.NLS; public abstract class ACBuilder extends IncrementalProjectBuilder implements IMarkerGenerator { @@ -222,4 +223,16 @@ public abstract class ACBuilder extends IncrementalProjectBuilder implements IMa printEvent(IncrementalProjectBuilder.CLEAN_BUILD, null); } + /** + * Default ACBuilder shouldn't require locking the workspace during a CDT Project build. + * + * Note this may have a detrimental effect on #getDelta(). Derived builders which rely + * on #getDelta(...) being accurate should return a WorkspaceRoot scheduling rule. + * @since 5.2 + */ + @SuppressWarnings("rawtypes") + public ISchedulingRule getRule(int trigger, Map args) { + return null; + } + }