[llvm] r241012 - Reapply "Use gethostuuid() on Mac to identify hosts for LockFileManager"
Eric Christopher
echristo at gmail.com
Mon Jun 29 15:28:26 PDT 2015
On Mon, Jun 29, 2015 at 3:26 PM Ben Langmuir <blangmuir at apple.com> wrote:
> On Jun 29, 2015, at 3:20 PM, Eric Christopher <echristo at gmail.com> wrote:
>
> Uh...
>
> Why not just check for the header and use that?
>
>
> gethostuuid() is defined in unistd.h on recent versions of Mac. The
> presence of uuid.h is necessary but not sufficient.
>
>
IIRC I put in some other checks for uuid.h at one point, you might want to
audit it.
That said, you can still check for the function in the available headers...
> Or check for the functions you need etc at configure/cmake time?
>
>
> Sadly, on some platforms and/or versions where this function exists, it
> returns a bogus value.
>
>
Released versions?
If so, this is just bogus all over the place. :\ That said you could
restrict the use by known good versions or write checks to make sure that
it's valid to use rather than #ifdef'ing them.
-eric
>
> -eric
>
> On Mon, Jun 29, 2015 at 3:19 PM Ben Langmuir <blangmuir at apple.com> wrote:
>
>> Author: benlangmuir
>> Date: Mon Jun 29 17:16:39 2015
>> New Revision: 241012
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=241012&view=rev
>> Log:
>> Reapply "Use gethostuuid() on Mac to identify hosts for LockFileManager"
>>
>> Reapplies r241005 after fixing the build on non-Mac platforms. Original
>> commit message below.
>>
>> 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
>>
>> Modified:
>> llvm/trunk/lib/Support/LockFileManager.cpp
>>
>> Modified: llvm/trunk/lib/Support/LockFileManager.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/LockFileManager.cpp?rev=241012&r1=241011&r2=241012&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Support/LockFileManager.cpp (original)
>> +++ llvm/trunk/lib/Support/LockFileManager.cpp Mon Jun 29 17:16:39 2015
>> @@ -21,6 +21,16 @@
>> #if LLVM_ON_UNIX
>> #include <unistd.h>
>> #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;
>>
>> /// \brief Attempt to read the lock file with the given name, if it
>> exists.
>> @@ -56,14 +66,45 @@ LockFileManager::readLockFile(StringRef
>> 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);
>> + StringRef UUIDRef(UUIDStr);
>> + HostID.append(UUIDRef.begin(), UUIDRef.end());
>> +
>> +#elif LLVM_ON_UNIX
>> + char HostName[256];
>> + HostName[255] = 0;
>> + HostName[0] = 0;
>> + gethostname(HostName, 255);
>> + StringRef HostNameRef(HostName);
>> + HostID.append(HostNameRef.begin(), HostNameRef.end());
>> +
>> +#else
>> + StringRef Dummy("localhost");
>> + HostID.append(Dummy.begin(), Dummy.end());
>> +#endif
>> +
>> + return std::error_code();
>> +}
>> +
>> +bool LockFileManager::processStillExecuting(StringRef HostID, int PID) {
>> #if LLVM_ON_UNIX && !defined(__ANDROID__)
>> - char MyHostname[256];
>> - MyHostname[255] = 0;
>> - MyHostname[0] = 0;
>> - gethostname(MyHostname, 255);
>> + SmallString<256> StoredHostID;
>> + if (getHostID(StoredHostID))
>> + return true; // Conservatively assume it's executing on error.
>> +
>> // 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;
>> #endif
>>
>> @@ -126,17 +167,18 @@ LockFileManager::LockFileManager(StringR
>>
>> // 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
>> - // FIXME: move getpid() call into LLVM
>> - char hostname[256];
>> - hostname[255] = 0;
>> - hostname[0] = 0;
>> - gethostname(hostname, 255);
>> - Out << hostname << ' ' << getpid();
>> + Out << getpid();
>> #else
>> - Out << "localhost 1";
>> + Out << "1";
>> #endif
>> Out.close();
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150629/06fcf080/attachment.html>
More information about the llvm-commits
mailing list