[llvm] r241012 - Reapply "Use gethostuuid() on Mac to identify hosts for LockFileManager"

Eric Christopher echristo at gmail.com
Tue Jun 30 11:50:02 PDT 2015


On Mon, Jun 29, 2015 at 3:50 PM Ben Langmuir <blangmuir at apple.com> wrote:

> On Jun 29, 2015, at 3:28 PM, Eric Christopher <echristo at gmail.com> wrote:
>
>
>
> 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.
>
>
> I can’t find any other use of uuid.h in llvm or clang.  Do you recall
> where this was?
>
>
IIRC it was support, but it's been a few years.


>
> 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?
>
>
> Yes.
>
>
Whee. That said...


>
> 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.
>
>
> I’m not sure I understand - are you suggesting moving the
> platform-specific #ifdef I’m using into the configuration stage, or are you
> suggesting checking the validity of the return values directly?  If the
> latter, then unfortunately the “bad” values aren’t readily distinguishable,
> they’re just not “unique” enough.
>
>
Since you've got a version of it you can still make it a configure time
check rather than a compile one to keep the amount of version specific
ifdefs out of the file. If you need help with the autoconf side I can help,
the cmake side... I'll punt to Chris B or someone. :)

-eric


> Ben
>
>
> -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/20150630/c5326a20/attachment.html>


More information about the llvm-commits mailing list