* Path locking in addToStore() and expandPath().

This commit is contained in:
Eelco Dolstra 2003-08-04 07:09:36 +00:00
parent c95b4ad290
commit d2e963f7a3
2 changed files with 16 additions and 1 deletions

View file

@ -86,7 +86,7 @@ FSId normaliseFState(FSId id, FSIdSet pending)
/* Obtain locks on all output paths. The locks are automatically /* Obtain locks on all output paths. The locks are automatically
released when we exit this function or Nix crashes. */ released when we exit this function or Nix crashes. */
PathLocks outputLock(pathsFromOutPaths(outPaths)); PathLocks outputLocks(pathsFromOutPaths(outPaths));
/* Now check again whether there is a successor. This is because /* Now check again whether there is a successor. This is because
another process may have started building in parallel. After another process may have started building in parallel. After

View file

@ -7,6 +7,7 @@
#include "globals.hh" #include "globals.hh"
#include "db.hh" #include "db.hh"
#include "archive.hh" #include "archive.hh"
#include "pathlocks.hh"
#include "normalise.hh" #include "normalise.hh"
@ -211,10 +212,19 @@ string expandId(const FSId & id, const string & target,
if (target.empty()) if (target.empty())
return path; return path;
else { else {
/* Acquire a lock on the target path. */
Strings lockPaths;
lockPaths.push_back(target);
PathLocks outputLock(lockPaths);
/* Copy. */
copyPath(path, target); copyPath(path, target);
/* Register the target path. */
Transaction txn(nixDB); Transaction txn(nixDB);
registerPath(txn, target, id); registerPath(txn, target, id);
txn.commit(); txn.commit();
return target; return target;
} }
} }
@ -265,7 +275,12 @@ void addToStore(string srcPath, string & dstPath, FSId & id,
} catch (...) { } catch (...) {
} }
Strings lockPaths;
lockPaths.push_back(dstPath);
PathLocks outputLock(lockPaths);
copyPath(srcPath, dstPath); copyPath(srcPath, dstPath);
Transaction txn(nixDB); Transaction txn(nixDB);
registerPath(txn, dstPath, id); registerPath(txn, dstPath, id);
txn.commit(); txn.commit();