[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