From 909fbb9de1e3e2d020a3dd000b9009a5ff1aaeca Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 4 Dec 2008 14:29:41 +0000 Subject: * When using build hooks, for any nix-store -r build operation, it is necessary that at least one build hook doesn't return "postpone", otherwise nix-store will barf ("waiting for a build slot, yet there are no running children"). So inform the build hook when this is the case, so that it can start a build even when that would exceed the maximum load on a machine. --- src/libstore/build.cc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/libstore') diff --git a/src/libstore/build.cc b/src/libstore/build.cc index a1c99cddd040..fbec67598708 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -219,6 +219,9 @@ public: /* Can we start another child process? */ bool canBuildMore(); + /* Can we postpone a build right now? */ + bool canPostpone(); + /* Registers a running child process. `inBuildSlot' means that the process counts towards the jobs limit. */ void childStarted(GoalPtr goal, pid_t pid, @@ -1296,7 +1299,9 @@ DerivationGoal::HookReply DerivationGoal::tryBuildHook() (worker.canBuildMore() ? (string) "1" : "0").c_str(), thisSystem.c_str(), drv.platform.c_str(), - drvPath.c_str(), NULL); + drvPath.c_str(), + (worker.canPostpone() ? (string) "0" : "1").c_str(), + NULL); throw SysError(format("executing `%1%'") % buildHook); @@ -2602,6 +2607,12 @@ bool Worker::canBuildMore() } +bool Worker::canPostpone() +{ + return children.size() != 0; +} + + void Worker::childStarted(GoalPtr goal, pid_t pid, const set & fds, bool inBuildSlot) { -- cgit 1.4.1