mirror of
https://github.com/NixOS/nix
synced 2025-06-28 17:51:15 +02:00
* True parallel builds. Nix can now run as many build jobs in
parallel as possible (similar to GNU Make's `-j' switch). This is useful on SMP systems, but it is especially useful for doing builds on multiple machines. The idea is that a large derivation is initiated on one master machine, which then distributes sub-derivations to any number of slave machines. This should not happen synchronously or in lock-step, so the master must be capable of dealing with multiple parallel build jobs. We now have the infrastructure to support this. TODO: substitutes are currently broken.
This commit is contained in:
parent
aea436503e
commit
c8d3882cdc
12 changed files with 696 additions and 309 deletions
|
@ -45,9 +45,24 @@ bool lockFile(int fd, LockType lockType, bool wait)
|
|||
static StringSet lockedPaths; /* !!! not thread-safe */
|
||||
|
||||
|
||||
PathLocks::PathLocks(const PathSet & _paths)
|
||||
PathLocks::PathLocks()
|
||||
: deletePaths(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PathLocks::PathLocks(const PathSet & paths)
|
||||
: deletePaths(false)
|
||||
{
|
||||
lockPaths(paths);
|
||||
}
|
||||
|
||||
|
||||
void PathLocks::lockPaths(const PathSet & _paths)
|
||||
{
|
||||
/* May be called only once! */
|
||||
assert(this->paths.empty());
|
||||
|
||||
/* Note that `fds' is built incrementally so that the destructor
|
||||
will only release those locks that we have already acquired. */
|
||||
|
||||
|
@ -80,6 +95,8 @@ PathLocks::PathLocks(const PathSet & _paths)
|
|||
/* Acquire an exclusive lock. */
|
||||
lockFile(fd, ltWrite, true);
|
||||
|
||||
debug(format("lock acquired on `%1%'") % lockPath);
|
||||
|
||||
lockedPaths.insert(lockPath);
|
||||
}
|
||||
}
|
||||
|
@ -88,7 +105,7 @@ PathLocks::PathLocks(const PathSet & _paths)
|
|||
PathLocks::~PathLocks()
|
||||
{
|
||||
for (list<int>::iterator i = fds.begin(); i != fds.end(); i++)
|
||||
close(*i);
|
||||
if (close(*i) != 0) throw SysError("closing fd");
|
||||
|
||||
for (Paths::iterator i = paths.begin(); i != paths.end(); i++) {
|
||||
checkInterrupt();
|
||||
|
@ -99,6 +116,7 @@ PathLocks::~PathLocks()
|
|||
the lock file is an optimisation, not a necessity. */
|
||||
}
|
||||
lockedPaths.erase(*i);
|
||||
debug(format("lock released on `%1%'") % *i);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue