* execl() requires a terminating 0.
* When a fast build wakes up a goal, try to start that goal in the same iteration of the startBuild() loop of run(). Otherwise no job might be started until the next job terminates.
This commit is contained in:
parent
4fc00cbec1
commit
ace8872706
1 changed files with 21 additions and 10 deletions
|
@ -213,6 +213,9 @@ private:
|
||||||
list of unfinished inputs. */
|
list of unfinished inputs. */
|
||||||
PathSet buildable;
|
PathSet buildable;
|
||||||
|
|
||||||
|
/* Should be set whenever a goal is added to `buildable'. */
|
||||||
|
bool newBuildables;
|
||||||
|
|
||||||
/* Child processes currently running. */
|
/* Child processes currently running. */
|
||||||
Building building;
|
Building building;
|
||||||
|
|
||||||
|
@ -327,8 +330,10 @@ bool Normaliser::addGoal(Path nePath)
|
||||||
|
|
||||||
/* Maintain the invariant that all goals with no unfinished inputs
|
/* Maintain the invariant that all goals with no unfinished inputs
|
||||||
are in the `buildable' set. */
|
are in the `buildable' set. */
|
||||||
if (goal.unfinishedInputs.empty())
|
if (goal.unfinishedInputs.empty()) {
|
||||||
buildable.insert(nePath);
|
buildable.insert(nePath);
|
||||||
|
newBuildables = true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Add the goal to the goal graph. */
|
/* Add the goal to the goal graph. */
|
||||||
goals[nePath] = goal;
|
goals[nePath] = goal;
|
||||||
|
@ -347,14 +352,19 @@ void Normaliser::run()
|
||||||
|
|
||||||
/* Start building as many buildable goals as possible. */
|
/* Start building as many buildable goals as possible. */
|
||||||
bool madeProgress = false;
|
bool madeProgress = false;
|
||||||
|
|
||||||
for (PathSet::iterator i = buildable.begin();
|
do {
|
||||||
i != buildable.end(); ++i)
|
newBuildables = false;
|
||||||
|
for (PathSet::iterator i = buildable.begin();
|
||||||
if (startBuild(*i)) {
|
i != buildable.end(); ++i)
|
||||||
madeProgress = true;
|
if (startBuild(*i)) {
|
||||||
buildable.erase(*i);
|
madeProgress = true;
|
||||||
}
|
buildable.erase(*i);
|
||||||
|
}
|
||||||
|
/* Continue while `newBuildables' is true. This happens
|
||||||
|
when startBuild() fast-builds a goal and wakes up
|
||||||
|
another goal. */
|
||||||
|
} while (newBuildables);
|
||||||
|
|
||||||
/* Wait until any child finishes (which may allow us to build
|
/* Wait until any child finishes (which may allow us to build
|
||||||
new goals). */
|
new goals). */
|
||||||
|
@ -684,7 +694,7 @@ Normaliser::HookReply Normaliser::tryBuildHook(Goal & goal)
|
||||||
(canBuildMore() ? (string) "1" : "0").c_str(),
|
(canBuildMore() ? (string) "1" : "0").c_str(),
|
||||||
thisSystem.c_str(),
|
thisSystem.c_str(),
|
||||||
goal.expr.derivation.platform.c_str(),
|
goal.expr.derivation.platform.c_str(),
|
||||||
goal.nePath.c_str());
|
goal.nePath.c_str(), 0);
|
||||||
|
|
||||||
throw SysError(format("executing `%1%'") % buildHook);
|
throw SysError(format("executing `%1%'") % buildHook);
|
||||||
|
|
||||||
|
@ -1093,6 +1103,7 @@ void Normaliser::removeGoal(Goal & goal)
|
||||||
if (waiter.unfinishedInputs.empty()) {
|
if (waiter.unfinishedInputs.empty()) {
|
||||||
debug(format("waking up goal `%1%'") % waiter.nePath);
|
debug(format("waking up goal `%1%'") % waiter.nePath);
|
||||||
buildable.insert(waiter.nePath);
|
buildable.insert(waiter.nePath);
|
||||||
|
newBuildables = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue