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

Ben Langmuir blangmuir at apple.com
Mon Jun 29 15:26:28 PDT 2015


> 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.

> 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.

> 
> -eric
> 
> On Mon, Jun 29, 2015 at 3:19 PM Ben Langmuir <blangmuir at apple.com <mailto: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 <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 <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 <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <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/e13893b7/attachment.html>


More information about the llvm-commits mailing list