Fixes:
- Identifiers starting with _ are prohibited
- Some driveby header dependency cleaning which wound up with doing some
extra fixups.
- Fucking C style casts, man. C++ made these 1000% worse by letting you
also do memory corruption with them with references.
- Remove casts to Expr * where ExprBlackHole is an incomplete type by
introducing an explicitly-cast eBlackHoleAddr as Expr *.
- An incredibly illegal cast of the text bytes of the StorePath hash
into a size_t directly. You can't DO THAT.
Replaced with actually parsing the hash so we get 100% of the bits
being entropy, then memcpying the start of the hash. If this shows
up in a profile we should just make the hash parser faster with a
lookup table or something sensible like that.
- This horrendous bit of UB which I thankfully slapped a deprecation
warning on, built, and it didn't trigger anywhere so it was dead
code and I just deleted it. But holy crap you *cannot* do that.
inline void mkString(const Symbol & s)
{
mkString(((const std::string &) s).c_str());
}
- Some wrong lints. Lots of wrong macro lints, one wrong
suspicious-sizeof lint triggered by the template being instantiated
with only pointers, but the calculation being correct for both
pointers and not-pointers.
- Exceptions in destructors strike again. I tried to catch the
exceptions that might actually happen rather than all the exceptions
imaginable. We can let the runtime hard-kill it on other exceptions
imo.
Change-Id: I71761620846cba64d66ee7ca231b20c061e69710
62 lines
1.2 KiB
C++
62 lines
1.2 KiB
C++
#pragma once
|
|
///@file
|
|
|
|
#include "file-descriptor.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.
|
|
*/
|
|
AutoCloseFD openLockFile(const Path & path, bool create);
|
|
|
|
/**
|
|
* Delete an open lock file.
|
|
*/
|
|
void deleteLockFile(const Path & path, int fd);
|
|
|
|
enum LockType { ltRead, ltWrite, ltNone };
|
|
|
|
bool lockFile(int fd, LockType lockType, bool wait);
|
|
|
|
class PathLocks
|
|
{
|
|
private:
|
|
typedef std::pair<int, Path> FDPair;
|
|
std::list<FDPair> fds;
|
|
bool deletePaths;
|
|
|
|
public:
|
|
PathLocks();
|
|
PathLocks(const PathSet & paths,
|
|
const std::string & waitMsg = "");
|
|
bool lockPaths(const PathSet & _paths,
|
|
const std::string & waitMsg = "",
|
|
bool wait = true);
|
|
~PathLocks();
|
|
void unlock();
|
|
void setDeletion(bool deletePaths);
|
|
};
|
|
|
|
struct FdLock
|
|
{
|
|
int fd;
|
|
bool acquired = false;
|
|
|
|
FdLock(int fd, LockType lockType, bool wait, std::string_view waitMsg);
|
|
|
|
~FdLock()
|
|
{
|
|
try {
|
|
if (acquired)
|
|
lockFile(fd, ltNone, false);
|
|
} catch (SysError &) {
|
|
ignoreException();
|
|
}
|
|
}
|
|
};
|
|
|
|
}
|