12#include "llvm/Config/llvm-config.h"
26#include <system_error>
36#if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1050)
37#define USE_OSX_GETHOSTUUID 1
39#define USE_OSX_GETHOSTUUID 0
42#if USE_OSX_GETHOSTUUID
53std::optional<LockFileManager::OwnedByAnother>
54LockFileManager::readLockFile(
StringRef LockFileName) {
72 Owner.OwnerHostName = Hostname;
74 if (processStillExecuting(
Owner.OwnerHostName,
Owner.OwnerPID))
86#if USE_OSX_GETHOSTUUID
88 struct timespec wait = {1, 0};
90 if (gethostuuid(uuid, &wait) != 0)
93 uuid_string_t UUIDStr;
94 uuid_unparse(uuid, UUIDStr);
102 gethostname(HostName, 255);
111 return std::error_code();
114bool LockFileManager::processStillExecuting(
StringRef HostID,
int PID) {
115#if LLVM_ON_UNIX && !defined(__ANDROID__)
116 SmallString<256> StoredHostID;
121 if (StoredHostID == HostID && getsid(PID) == -1 && errno == ESRCH)
137class RemoveUniqueLockFileOnSignal {
139 bool RemoveImmediately;
141 RemoveUniqueLockFileOnSignal(StringRef Name)
146 ~RemoveUniqueLockFileOnSignal() {
147 if (!RemoveImmediately) {
156 void lockAcquired() { RemoveImmediately =
false; }
162 : FileName(FileName), Owner(OwnerUnknown{}) {}
167 assert(std::holds_alternative<OwnerUnknown>(Owner) &&
168 "lock has already been attempted");
174 LockFileName = AbsoluteFileName;
175 LockFileName +=
".lock";
179 if (
auto LockFileOwner = readLockFile(LockFileName)) {
180 Owner = std::move(*LockFileOwner);
185 UniqueLockFileName = LockFileName;
186 UniqueLockFileName +=
"-%%%%%%%%";
187 int UniqueLockFileID;
189 UniqueLockFileName, UniqueLockFileID, UniqueLockFileName))
194 RemoveUniqueLockFileOnSignal RemoveUniqueFile(UniqueLockFileName);
209 "failed to write to " + UniqueLockFileName);
212 return std::move(Err);
221 RemoveUniqueFile.lockAcquired();
228 " to " + UniqueLockFileName);
232 if (
auto LockFileOwner = readLockFile(LockFileName)) {
233 Owner = std::move(*LockFileOwner);
254 if (!std::holds_alternative<OwnedByUs>(Owner))
269 auto *LockFileOwner = std::get_if<OwnedByAnother>(&Owner);
271 "waiting for lock to be unlocked without knowing the owner");
277 using namespace std::chrono_literals;
288 if (!processStillExecuting(LockFileOwner->OwnerHostName,
289 LockFileOwner->OwnerPID))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static ManagedStatic< DebugCounterOwner > Owner
Provides ErrorOr<T> smart pointer.
static std::error_code getHostID(SmallVectorImpl< char > &HostID)
Provides a library for accessing information about this process and other processes on the operating ...
This file defines the SmallVector class.
Represents either an error or a value T.
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
A class to help implement exponential backoff.
LLVM_ABI bool waitForNextAttempt()
Blocks while waiting for the next attempt.
std::error_code unsafeMaybeUnlock() override
Remove the lock file.
WaitForUnlockResult waitForUnlockFor(std::chrono::seconds MaxSeconds) override
For a shared lock, wait until the owner releases the lock.
Expected< bool > tryLock() override
Tries to acquire the lock without blocking.
~LockFileManager() override
Unlocks the lock if previously acquired by tryLock().
This interface provides simple read-only access to a block of memory, and provides simple methods for...
StringRef getBuffer() const
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFile(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
StringRef - Represent a constant reference to a string, i.e.
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
LLVM_ABI size_t find_first_not_of(char C, size_t From=0) const
Find the first character in the string that is not C or npos if not found.
A raw_ostream that writes to a file descriptor.
bool has_error() const
Return the value of the flag in this raw_fd_ostream indicating whether an output error has been encou...
std::error_code error() const
void close()
Manually flush the stream and close the file.
void clear_error()
Set the flag read by has_error() to false.
static LLVM_ABI Pid getProcessId()
Get the process's identifier.
LLVM_ABI std::error_code access(const Twine &Path, AccessMode Mode)
Can the file be accessed?
LLVM_ABI bool exists(const basic_file_status &status)
Does file exist?
LLVM_ABI std::error_code create_link(const Twine &to, const Twine &from)
Create a link from from to to.
LLVM_ABI std::error_code createUniqueFile(const Twine &Model, int &ResultFD, SmallVectorImpl< char > &ResultPath, OpenFlags Flags=OF_None, unsigned Mode=all_read|all_write)
Create a uniquely named file.
LLVM_ABI std::error_code remove(const Twine &path, bool IgnoreNonExisting=true)
Remove path.
LLVM_ABI std::error_code make_absolute(SmallVectorImpl< char > &path)
Make path an absolute path.
ScopedSetting scopedDisable()
LLVM_ABI void DontRemoveFileOnSignal(StringRef Filename)
This function removes a file from the list of files to be removed on signal delivery.
LLVM_ABI bool RemoveFileOnSignal(StringRef Filename, std::string *ErrMsg=nullptr)
This function registers signal handlers to ensure that if a signal gets delivered that the named file...
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI std::pair< StringRef, StringRef > getToken(StringRef Source, StringRef Delimiters=" \t\n\v\f\r")
getToken - This function extracts one token from source, ignoring any leading characters that appear ...
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
@ no_such_file_or_directory
WaitForUnlockResult
Describes the result of waiting for the owner to release the lock.
@ Success
The lock was released successfully.
@ OwnerDied
Owner died while holding the lock.
@ Timeout
Reached timeout while waiting for the owner to release the lock.
std::error_code errnoAsErrorCode()
Helper to get errno as an std::error_code.