diff options
-rw-r--r-- | src/libstore/build.cc | 5 | ||||
-rw-r--r-- | src/libstore/pathlocks.cc | 8 | ||||
-rw-r--r-- | src/libstore/pathlocks.hh | 1 |
3 files changed, 14 insertions, 0 deletions
diff --git a/src/libstore/build.cc b/src/libstore/build.cc index d44dcf0ff0e4..5f1eb3415e26 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -1023,6 +1023,8 @@ void DerivationGoal::tryToBuild() } catch (BuildError & e) { printMsg(lvlError, e.msg()); + outputLocks.unlock(); + buildUser.release(); if (printBuildTrace) { if (usingBuildHook) printMsg(lvlError, format("@ hook-failed %1% %2% %3% %4%") @@ -1130,6 +1132,8 @@ void DerivationGoal::buildDone() } catch (BuildError & e) { printMsg(lvlError, e.msg()); + outputLocks.unlock(); + buildUser.release(); if (printBuildTrace) { /* When using a build hook, the hook will return a remote build failure using exit code 100. Anything @@ -2068,6 +2072,7 @@ void DerivationGoal::computeClosure() create new lock files with the same names as the old (unlinked) lock files. */ outputLocks.setDeletion(true); + outputLocks.unlock(); } diff --git a/src/libstore/pathlocks.cc b/src/libstore/pathlocks.cc index df1f0b1e3831..f8753bcb66e0 100644 --- a/src/libstore/pathlocks.cc +++ b/src/libstore/pathlocks.cc @@ -204,6 +204,12 @@ void PathLocks::lockPaths(const PathSet & _paths, const string & waitMsg) PathLocks::~PathLocks() { + unlock(); +} + + +void PathLocks::unlock() +{ for (list<FDPair>::iterator i = fds.begin(); i != fds.end(); i++) { if (deletePaths) deleteLockFilePreClose(i->second, i->first); @@ -216,6 +222,8 @@ PathLocks::~PathLocks() debug(format("lock released on `%1%'") % i->second); } + + fds.clear(); } diff --git a/src/libstore/pathlocks.hh b/src/libstore/pathlocks.hh index 8b4100028f0b..9898b497b94d 100644 --- a/src/libstore/pathlocks.hh +++ b/src/libstore/pathlocks.hh @@ -36,6 +36,7 @@ public: void lockPaths(const PathSet & _paths, const string & waitMsg = ""); ~PathLocks(); + void unlock(); void setDeletion(bool deletePaths); }; |