mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-17 17:06:59 +00:00
Use gethostuuid() on Mac to identify hosts for LockFileManager
The hostname can be very unstable when there are many machines on the network competing for the same name. Using the hardware UUID makes it less likely to have collisions or to consider files written by the current host to be owned by a different one at a later time. rdar://problem/21512307 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241005 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9cbdfb5c05
commit
d5c333b731
@ -21,6 +21,16 @@
|
|||||||
#if LLVM_ON_UNIX
|
#if LLVM_ON_UNIX
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__APPLE__) && defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && (__MAC_OS_X_VERSION_MIN_REQUIRED > 1050)
|
||||||
|
#define USE_OSX_GETHOSTUUID 1
|
||||||
|
#else
|
||||||
|
#define USE_OSX_GETHOSTUUID 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if USE_OSX_GETHOSTUUID
|
||||||
|
#include <uuid/uuid.h>
|
||||||
|
#endif
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
/// \brief Attempt to read the lock file with the given name, if it exists.
|
/// \brief Attempt to read the lock file with the given name, if it exists.
|
||||||
@ -56,14 +66,43 @@ LockFileManager::readLockFile(StringRef LockFileName) {
|
|||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LockFileManager::processStillExecuting(StringRef Hostname, int PID) {
|
static std::error_code getHostID(SmallVectorImpl<char> &HostID) {
|
||||||
|
HostID.clear();
|
||||||
|
|
||||||
|
#if USE_OSX_GETHOSTUUID
|
||||||
|
// On OS X, use the more stable hardware UUID instead of hostname.
|
||||||
|
struct timespec wait = {1, 0}; // 1 second.
|
||||||
|
uuid_t uuid;
|
||||||
|
if (gethostuuid(uuid, &wait) != 0)
|
||||||
|
return std::error_code(errno, std::system_category());
|
||||||
|
|
||||||
|
uuid_string_t UUIDStr;
|
||||||
|
uuid_unparse(uuid, UUIDStr);
|
||||||
|
assert(strlen(UUIDStr) == 36);
|
||||||
|
HostID.append(&UUIDStr[0], &UUIDStr[36]);
|
||||||
|
|
||||||
|
#elif LLVM_ON_UNIX
|
||||||
|
char hostname[256];
|
||||||
|
hostname[255] = 0;
|
||||||
|
hostname[0] = 0;
|
||||||
|
gethostname(hostname, 255);
|
||||||
|
HostID = hostname;
|
||||||
|
|
||||||
|
#else
|
||||||
|
HostID = "localhost";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return std::error_code();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LockFileManager::processStillExecuting(StringRef HostID, int PID) {
|
||||||
#if LLVM_ON_UNIX && !defined(__ANDROID__)
|
#if LLVM_ON_UNIX && !defined(__ANDROID__)
|
||||||
char MyHostname[256];
|
SmallString<256> StoredHostID;
|
||||||
MyHostname[255] = 0;
|
if (getHostID(StoredHostID))
|
||||||
MyHostname[0] = 0;
|
return true; // Conservatively assume it's executing on error.
|
||||||
gethostname(MyHostname, 255);
|
|
||||||
// Check whether the process is dead. If so, we're done.
|
// Check whether the process is dead. If so, we're done.
|
||||||
if (MyHostname == Hostname && getsid(PID) == -1 && errno == ESRCH)
|
if (StoredHostID == HostID && getsid(PID) == -1 && errno == ESRCH)
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -126,17 +165,18 @@ LockFileManager::LockFileManager(StringRef FileName)
|
|||||||
|
|
||||||
// Write our process ID to our unique lock file.
|
// Write our process ID to our unique lock file.
|
||||||
{
|
{
|
||||||
raw_fd_ostream Out(UniqueLockFileID, /*shouldClose=*/true);
|
SmallString<256> HostID;
|
||||||
|
if (auto EC = getHostID(HostID)) {
|
||||||
|
Error = EC;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
raw_fd_ostream Out(UniqueLockFileID, /*shouldClose=*/true);
|
||||||
|
Out << HostID << ' ';
|
||||||
#if LLVM_ON_UNIX
|
#if LLVM_ON_UNIX
|
||||||
// FIXME: move getpid() call into LLVM
|
Out << getpid();
|
||||||
char hostname[256];
|
|
||||||
hostname[255] = 0;
|
|
||||||
hostname[0] = 0;
|
|
||||||
gethostname(hostname, 255);
|
|
||||||
Out << hostname << ' ' << getpid();
|
|
||||||
#else
|
#else
|
||||||
Out << "localhost 1";
|
Out << "1";
|
||||||
#endif
|
#endif
|
||||||
Out.close();
|
Out.close();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user