mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-11 00:36:20 +02:00
c970b28ba0
fixed-output derivations or substitutions try to build the same store path at the same time. Locking generally catches this, but not between multiple goals in the same process. This happened especially often (actually, only) in the build farm with fetchurl downloads of the same file being executed on multiple machines and then copied back to the main machine where they would clobber each other (NIXBF-13). Solution: if a goal notices that the output path is already locked, then go to sleep until another goal finishes (hopefully the one locking the path) and try again.
49 lines
1.1 KiB
C++
49 lines
1.1 KiB
C++
#ifndef __PATHLOCKS_H
|
|
#define __PATHLOCKS_H
|
|
|
|
#include "types.hh"
|
|
|
|
|
|
namespace nix {
|
|
|
|
|
|
/* Open (possibly create) a lock file and return the file descriptor.
|
|
-1 is returned if create is false and the lock could not be opened
|
|
because it doesn't exist. Any other error throws an exception. */
|
|
int openLockFile(const Path & path, bool create);
|
|
|
|
/* Delete an open lock file. Both must be called to be fully portable
|
|
between Unix and Windows. */
|
|
void deleteLockFilePreClose(const Path & path, int fd);
|
|
void deleteLockFilePostClose(const Path & path);
|
|
|
|
typedef enum LockType { ltRead, ltWrite, ltNone };
|
|
|
|
bool lockFile(int fd, LockType lockType, bool wait);
|
|
|
|
|
|
class PathLocks
|
|
{
|
|
private:
|
|
typedef std::pair<int, Path> FDPair;
|
|
list<FDPair> fds;
|
|
bool deletePaths;
|
|
|
|
public:
|
|
PathLocks();
|
|
PathLocks(const PathSet & paths,
|
|
const string & waitMsg = "");
|
|
void lockPaths(const PathSet & _paths,
|
|
const string & waitMsg = "");
|
|
~PathLocks();
|
|
void setDeletion(bool deletePaths);
|
|
};
|
|
|
|
|
|
bool pathIsLockedByMe(const Path & path);
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif /* !__PATHLOCKS_H */
|