forked from lix-project/lix
824b154ce8
the DerivationGoal runs. Otherwise, if a goal is a top-level goal, then the lock won't be released until nix-store finishes. With --keep-going and lots of top-level goals, it's possible to run out of file descriptors (this happened sometimes in the build farm for Nixpkgs). Also, for failed derivation, it won't be possible to build it again until the lock is released. * Idem for locks on build users: these weren't released in a timely manner for failed top-level derivation goals. So if there were more than (say) 10 such failed builds, you would get an error about having run out of build users.
50 lines
1.1 KiB
C++
50 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);
|
|
|
|
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 unlock();
|
|
void setDeletion(bool deletePaths);
|
|
};
|
|
|
|
|
|
bool pathIsLockedByMe(const Path & path);
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif /* !__PATHLOCKS_H */
|