[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