]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
Thread fixes for Hostinfo_MachineID
authorVMware, Inc <>
Thu, 17 Jun 2010 20:59:46 +0000 (13:59 -0700)
committerMarcelo Vanzin <mvanzin@vmware.com>
Thu, 17 Jun 2010 20:59:46 +0000 (13:59 -0700)
Hostinfo_MachineID caches its results.  Make the cache atomic.
This uses atomic pointers because zero is a valid value for both
the name hash and hardware ID.

Signed-off-by: Marcelo Vanzin <mvanzin@vmware.com>
open-vm-tools/lib/misc/machineID.c

index c2fd5c86b18e7b373a748cbcef6a038f7d333664..a51e64ef2ab9c896c12be8e8347b20ba437126c1 100644 (file)
@@ -43,6 +43,7 @@
 #include "str.h"
 #include "err.h"
 #include "vm_product.h"
+#include "vm_atomic.h"
 
 #define LOGLEVEL_MODULE main
 #include "loglevel_user.h"
@@ -576,17 +577,20 @@ void
 Hostinfo_MachineID(uint32 *hostNameHash,    // OUT:
                    uint64 *hostHardwareID)  // OUT:
 {
-   static Bool fetchValues = TRUE;
-   static uint64 cachedHardwareID;
-   static uint32 cachedHostNameHash;
+   static Atomic_Ptr cachedHardwareID;
+   static Atomic_Ptr cachedHostNameHash;
+   uint64 *tmpHardwareID;
+   uint32 *tmpNameHash;
 
    ASSERT(hostNameHash);
    ASSERT(hostHardwareID);
 
-   if (fetchValues) {
-      int  erc;
+   tmpNameHash = Atomic_ReadPtr(&cachedHostNameHash);
+   if (!tmpNameHash) {
       char *hostName;
 
+      tmpNameHash = Util_SafeMalloc(sizeof *tmpNameHash);
+
       // 4 bytes (32 bits) of host name information
       hostName = (char *) Hostinfo_HostName();
 
@@ -594,24 +598,40 @@ Hostinfo_MachineID(uint32 *hostNameHash,    // OUT:
          Warning("%s Hostinfo_HostName failure; providing default.\n",
                 __FUNCTION__);
 
-         cachedHostNameHash = 0;
+         *tmpNameHash = 0;
       } else {
-         cachedHostNameHash = HostNameHash((unsigned char *) hostName);
+         *tmpNameHash = HostNameHash((unsigned char *) hostName);
          free(hostName);
       }
 
+      if (Atomic_ReadIfEqualWritePtr(&cachedHostNameHash, NULL, 
+                                     tmpNameHash)) {
+         free(tmpNameHash);
+         tmpNameHash = Atomic_ReadPtr(&cachedHostNameHash);
+      }
+   }
+   *hostNameHash = *tmpNameHash;
+
+   tmpHardwareID = Atomic_ReadPtr(&cachedHardwareID);
+   if (!tmpHardwareID) {
+      int  erc;
+
+      tmpHardwareID = Util_SafeMalloc(sizeof *tmpHardwareID);
+
       // 8 bytes (64 bits) of hardware information
-      erc = ObtainHardwareID(&cachedHardwareID);
+      erc = ObtainHardwareID(tmpHardwareID);
       if (erc != 0) {
          Warning("%s ObtainHardwareID failure (%s); providing default.\n",
                  __FUNCTION__, Err_Errno2String(erc));
 
-         cachedHardwareID = 0;
+         *tmpHardwareID = 0;
       }
 
-      fetchValues = FALSE;
+      if (Atomic_ReadIfEqualWritePtr(&cachedHardwareID, NULL, 
+                                     tmpHardwareID)) {
+         free(tmpHardwareID);
+         tmpHardwareID = Atomic_ReadPtr(&cachedHardwareID);
+      }
    }
-
-   *hostNameHash = cachedHostNameHash;
-   *hostHardwareID = cachedHardwareID;
+   *hostHardwareID = *tmpHardwareID;
 }