diff --git a/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd b/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd
index 391e00f5984..e8a56781bf9 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd
+++ b/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd
@@ -1757,8 +1757,27 @@ If this attribute is not specified, MBS will assume that there are no reserved m
@@ -2549,15 +2551,36 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider } return parallelNumberAttribute.intValue(); } - + + private void setParallelizationNumAttribute(int parallelNumber) { + isParallelBuildEnabled = (parallelNumber != 1); + if (parallelNumber > 0) { + parallelNumberAttribute = parallelNumber; + } else { + // "optimal" + parallelNumberAttribute = -getOptimalParallelJobNum(); + } + } + @Override public int getParallelizationNum() { return Math.abs(getParallelizationNumAttribute()); } + /** + * {@inheritDoc} + * + * @param jobs - maximum number of jobs. There are 2 special cases: + *
- any number <=0 is interpreted as setting "optimal" property, + * the value of the number itself is ignored in this case + *
- value 1 will turn parallel mode off. + */ @Override public void setParallelizationNum(int jobs) throws CoreException { - if (isParallelBuildOn() && (parallelNumberAttribute == null || parallelNumberAttribute != jobs)) { + if (!supportsParallelBuild()) + return; + + if (parallelNumberAttribute == null || parallelNumberAttribute != jobs) { String curCmd = getParallelizationCmd(getParallelizationNum()); String args = getArgumentsAttribute(); String updatedArgs = removeCmd(args, curCmd); @@ -2565,12 +2588,7 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider setArgumentsAttribute(updatedArgs); } - if (jobs > 0) { - parallelNumberAttribute = jobs; - } else { - // "optimal" - parallelNumberAttribute = -getOptimalParallelJobNum(); - } + setParallelizationNumAttribute(jobs); setDirty(true); } } @@ -2620,6 +2638,9 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider @Override public boolean isParallelBuildOn() { + if (!supportsParallelBuild()) { + return false; + } if (isParallelBuildEnabled == null) { if (superClass != null) { return getSuperClass().isParallelBuildOn(); @@ -2639,27 +2660,12 @@ public class Builder extends HoldsOptions implements IBuilder, IMatchKeyProvider */ @Override public void setParallelBuildOn(boolean on) throws CoreException { - if (isParallelBuildOn() == on) - return; - if (on && !supportsParallelBuild()) - return; - - String curCmd = getParallelizationCmd(getParallelizationNum()); - String args = getArgumentsAttribute(); - String updatedArgs = removeCmd(args, curCmd); - if (!updatedArgs.equals(args)) { - setArgumentsAttribute(updatedArgs); - } - - isParallelBuildEnabled = on; - - if (isParallelBuildEnabled) { - // "optimal" - parallelNumberAttribute = -getOptimalParallelJobNum(); + if (on) { + // set "optimal" jobs by default when enabling parallel build + setParallelizationNum(-1); } else { - parallelNumberAttribute = 1; + setParallelizationNum(1); } - setDirty(true); } public SetcontributeErrorParsers(Set set){ diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java index 4ac53e132a9..011aa7ccbe4 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java @@ -2268,12 +2268,9 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild /** * Sets maximum number of parallel threads/jobs to be used by builder. - * Note that the number will be set only if the builder is in "parallel" - * mode. * - * @param jobs - maximum number of jobs or threads. If the number is 0 - * or negative, "optimal" number will be set, - * see {@link Builder#getOptimalParallelJobNum()}. + * @param jobs - maximum number of jobs or threads. For details how + * the number is interpreted see {@link Builder#setParallelizationNum(int)}. */ public void setParallelNumber(int jobs){ try { diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/newmake/core/IMakeCommonBuildInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/newmake/core/IMakeCommonBuildInfo.java index 553c78170b9..024a04a6be9 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/newmake/core/IMakeCommonBuildInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/newmake/core/IMakeCommonBuildInfo.java @@ -50,12 +50,10 @@ public interface IMakeCommonBuildInfo { /** * Sets maximum number of parallel threads/jobs to be used by builder. - * Note that the number will be set only if the builder is in "parallel" - * mode. + * Note that this number can be interpreted by builder in a special way. + * @see Builder#setParallelizationNum(int) * * @param jobs - maximum number of jobs. - * Any number <=0 is treated as setting "optimal" property, - * the value of the number itself is ignored in this case. */ void setParallelizationNum(int jobs) throws CoreException; diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildBehaviourTab.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildBehaviourTab.java index 02b45c20994..46cf3e813f5 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildBehaviourTab.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/BuildBehaviourTab.java @@ -53,6 +53,7 @@ import org.eclipse.swt.widgets.Widget; */ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { private static final int SPINNER_MAX_VALUE = 10000; + private static final int SPINNER_MIN_VALUE = 2; private static final int TRI_STATES_SIZE = 4; // Widgets @@ -153,7 +154,7 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { s_parallelNumber = new Spinner(c3, SWT.BORDER); setupControl(s_parallelNumber, 1, GridData.BEGINNING); - s_parallelNumber.setValues(cpuNumber, 1, SPINNER_MAX_VALUE, 0, 1, 10); + s_parallelNumber.setValues(cpuNumber, SPINNER_MIN_VALUE, SPINNER_MAX_VALUE, 0, 1, 10); s_parallelNumber.addSelectionListener(new SelectionAdapter () { @Override public void widgetSelected(SelectionEvent e) { @@ -299,7 +300,7 @@ public class BuildBehaviourTab extends AbstractCBuildPropertyTab { bldr.supportsStopOnError(true) && bldr.supportsStopOnError(false)); } - + updateParallelBlock();