mirror of
https://github.com/NixOS/nix
synced 2025-07-07 01:51:47 +02:00
Add support for the build-timeout' and
--timeout' options.
This commit is contained in:
parent
9c99aa2620
commit
5c9e9f732d
12 changed files with 115 additions and 5 deletions
|
@ -142,6 +142,7 @@ static void initAndRun(int argc, char * * argv)
|
|||
maxBuildJobs = queryIntSetting("build-max-jobs", 1);
|
||||
buildCores = queryIntSetting("build-cores", 1);
|
||||
maxSilentTime = queryIntSetting("build-max-silent-time", 0);
|
||||
buildTimeout = queryIntSetting("build-timeout", 0);
|
||||
|
||||
/* Catch SIGINT. */
|
||||
struct sigaction act;
|
||||
|
@ -237,6 +238,8 @@ static void initAndRun(int argc, char * * argv)
|
|||
readOnlyMode = true;
|
||||
else if (arg == "--max-silent-time")
|
||||
maxSilentTime = getIntArg<unsigned int>(arg, i, args.end());
|
||||
else if (arg == "--timeout")
|
||||
buildTimeout = getIntArg<unsigned int>(arg, i, args.end());
|
||||
else if (arg == "--no-build-hook")
|
||||
useBuildHook = false;
|
||||
else if (arg == "--show-trace")
|
||||
|
|
|
@ -209,7 +209,10 @@ private:
|
|||
|
||||
/* Last time the goals in `waitingForAWhile' where woken up. */
|
||||
time_t lastWokenUp;
|
||||
|
||||
|
||||
/* Last time `waitForInput' was last called. */
|
||||
time_t lastWait;
|
||||
|
||||
public:
|
||||
|
||||
bool cacheFailure;
|
||||
|
@ -681,7 +684,8 @@ HookInstance::HookInstance()
|
|||
builderOut.readSide.close();
|
||||
if (dup2(builderOut.writeSide, 4) == -1)
|
||||
throw SysError("dupping builder's stdout/stderr");
|
||||
|
||||
|
||||
/* XXX: Pass `buildTimeout' to the hook? */
|
||||
execl(buildHook.c_str(), buildHook.c_str(), thisSystem.c_str(),
|
||||
(format("%1%") % maxSilentTime).str().c_str(),
|
||||
(format("%1%") % printBuildTrace).str().c_str(),
|
||||
|
@ -2666,7 +2670,14 @@ void Worker::waitForInput()
|
|||
struct timeval timeout;
|
||||
timeout.tv_usec = 0;
|
||||
time_t before = time(0);
|
||||
|
||||
|
||||
/* If a global timeout has been set, sleep until it's done. */
|
||||
if (buildTimeout != 0) {
|
||||
useTimeout = true;
|
||||
if (lastWait == 0 || lastWait > before) lastWait = before;
|
||||
timeout.tv_sec = std::max((time_t) 0, lastWait + buildTimeout - before);
|
||||
}
|
||||
|
||||
/* If we're monitoring for silence on stdout/stderr, sleep until
|
||||
the first deadline for any child. */
|
||||
if (maxSilentTime != 0) {
|
||||
|
@ -2678,8 +2689,11 @@ void Worker::waitForInput()
|
|||
}
|
||||
}
|
||||
if (oldest) {
|
||||
time_t silenceTimeout = std::max((time_t) 0, oldest + maxSilentTime - before);
|
||||
timeout.tv_sec = useTimeout
|
||||
? std::min(silenceTimeout, timeout.tv_sec)
|
||||
: silenceTimeout;
|
||||
useTimeout = true;
|
||||
timeout.tv_sec = std::max((time_t) 0, oldest + maxSilentTime - before);
|
||||
printMsg(lvlVomit, format("sleeping %1% seconds") % timeout.tv_sec);
|
||||
}
|
||||
}
|
||||
|
@ -2717,6 +2731,9 @@ void Worker::waitForInput()
|
|||
|
||||
time_t after = time(0);
|
||||
|
||||
/* Keep track of when we were last called. */
|
||||
lastWait = after;
|
||||
|
||||
/* Process all available file descriptors. */
|
||||
|
||||
/* Since goals may be canceled from inside the loop below (causing
|
||||
|
@ -2765,6 +2782,15 @@ void Worker::waitForInput()
|
|||
% goal->getName() % maxSilentTime);
|
||||
goal->cancel();
|
||||
}
|
||||
|
||||
if (buildTimeout != 0 &&
|
||||
after - before >= (time_t) buildTimeout)
|
||||
{
|
||||
printMsg(lvlError,
|
||||
format("%1% timed out after %2% seconds of activity")
|
||||
% goal->getName() % buildTimeout);
|
||||
goal->cancel();
|
||||
}
|
||||
}
|
||||
|
||||
if (!waitingForAWhile.empty() && lastWokenUp + wakeUpInterval <= after) {
|
||||
|
|
|
@ -26,6 +26,7 @@ unsigned int buildCores = 1;
|
|||
bool readOnlyMode = false;
|
||||
string thisSystem = "unset";
|
||||
time_t maxSilentTime = 0;
|
||||
time_t buildTimeout = 0;
|
||||
Paths substituters;
|
||||
bool useBuildHook = true;
|
||||
bool printBuildTrace = false;
|
||||
|
|
|
@ -72,6 +72,10 @@ extern string thisSystem;
|
|||
infinity. */
|
||||
extern time_t maxSilentTime;
|
||||
|
||||
/* The maximum duration in seconds that a builder can run. 0 means
|
||||
infinity. */
|
||||
extern time_t buildTimeout;
|
||||
|
||||
/* The substituters. There are programs that can somehow realise a
|
||||
store path without building, e.g., by downloading it or copying it
|
||||
from a CD. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue