]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
lib/lock: reapply previously reverted commit
authorVMware, Inc <>
Tue, 13 Mar 2012 20:00:12 +0000 (13:00 -0700)
committerDmitry Torokhov <dtor@vmware.com>
Tue, 13 Mar 2012 22:45:15 +0000 (15:45 -0700)
Now that the big change is in, reapply this change.

Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
open-vm-tools/lib/lock/ul.c
open-vm-tools/lib/lock/ulCondVar.c
open-vm-tools/lib/lock/ulExcl.c
open-vm-tools/lib/lock/ulInt.h
open-vm-tools/lib/lock/ulRW.c
open-vm-tools/lib/lock/ulRec.c
open-vm-tools/lib/lock/ulStats.c

index 597fda62ee16f1ac5320ca4fa6d6ec8e144b93b9..aa60e707776e62c7b02c1d7b7203b838eb1f64f2 100644 (file)
@@ -446,7 +446,8 @@ MXUserAllocPerThread(void)
 
    ASSERT(perThreadLock);
 
-   MXRecLockAcquire(perThreadLock);
+   MXRecLockAcquire(perThreadLock,
+                    NULL);          // non-stats
 
    if (perThreadFreeList == NULL) {
       perThread = Util_SafeMalloc(sizeof *perThread);
@@ -494,7 +495,8 @@ MXUserFreePerThread(MXUserPerThread *perThread)  // IN:
    perThreadLock = MXUserInternalSingleton(&perThreadLockMem);
    ASSERT(perThreadLock);
 
-   MXRecLockAcquire(perThreadLock);
+   MXRecLockAcquire(perThreadLock,
+                    NULL);          // non-stats
    perThread->next = perThreadFreeList;
    perThreadFreeList = perThread;
    MXRecLockRelease(perThreadLock);
index f9d560a40a765cde52b8334689c4900528c25c98..53cdc9385d0a015723ba6aa36f9f7b3675933aed 100644 (file)
@@ -300,7 +300,8 @@ MXUserWaitInternal(MXRecLock *lock,         // IN:
          LeaveCriticalSection(&condVar->x.compat.condVarLock);
       } while (!done);
 
-      MXRecLockAcquire(lock);
+      MXRecLockAcquire(lock,
+                       NULL);  // non-stats
 
       MXRecLockIncCount(lock, lockCount - 1);
 
index e7d0fe52af119215cc08d5db59e8c170774bfea8..ef5366f9978e3581b23f9bc618369da41d1b9075 100644 (file)
@@ -409,21 +409,15 @@ MXUser_AcquireExclLock(MXUserExclLock *lock)  // IN/OUT:
    MXUserAcquisitionTracking(&lock->header, TRUE);
 
    if (vmx86_stats) {
-      Bool contended;
-      VmTimeType start = 0;
+      VmTimeType value = 0;
       MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
 
-      if (LIKELY(stats != NULL)) {
-         start = Hostinfo_SystemTimerNS();
-      }
-
-      contended = MXRecLockAcquire(&lock->recursiveLock);
+      MXRecLockAcquire(&lock->recursiveLock, (stats == NULL) ? NULL : &value);
 
       if (LIKELY(stats != NULL)) {
          MXUserHisto *histo;
-         VmTimeType value = Hostinfo_SystemTimerNS() - start;
 
-         MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, contended,
+         MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, value != 0,
                                  value);
 
          histo = Atomic_ReadPtr(&stats->acquisitionHisto);
@@ -435,7 +429,8 @@ MXUser_AcquireExclLock(MXUserExclLock *lock)  // IN/OUT:
          stats->holdStart = Hostinfo_SystemTimerNS();
       }
    } else {
-      MXRecLockAcquire(&lock->recursiveLock);
+      MXRecLockAcquire(&lock->recursiveLock,
+                       NULL);  // non-stats
    }
 
    if (vmx86_debug && (MXRecLockCount(&lock->recursiveLock) > 1)) {
index abfa4905673be838d0f7347574ff501b4b568c60..58a60e57d36159ed5360bf8d55108f2cbd015542 100644 (file)
@@ -39,6 +39,7 @@ typedef pthread_t MXUserThreadID;
 
 #include "vm_basic_types.h"
 #include "vthreadBase.h"
+#include "hostinfo.h"
 
 #include "circList.h"
 
@@ -271,7 +272,7 @@ static INLINE void
 MXRecLockIncCount(MXRecLock *lock,  // IN/OUT:
                   int count)        // IN:
 {
-   ASSERT(count > 0);
+   ASSERT(count >= 0);
 
    if (MXRecLockCount(lock) == 0) {
       MXRecLockSetOwner(lock);
@@ -281,15 +282,21 @@ MXRecLockIncCount(MXRecLock *lock,  // IN/OUT:
 }
 
 
-static INLINE Bool
-MXRecLockAcquire(MXRecLock *lock)  // IN/OUT:
+static INLINE void
+MXRecLockAcquire(MXRecLock *lock,       // IN/OUT:
+                 VmTimeType *duration)  // OUT/OPT:
 {
    int err;
+   VmTimeType start = 0;
 
    if ((MXRecLockCount(lock) > 0) && MXRecLockIsOwner(lock)) {
       MXRecLockIncCount(lock, 1);
 
-      return FALSE;  // Not contended
+      if (duration != NULL) {
+         *duration = 0ULL;
+      }
+
+      return;  // Uncontended
    }
 
    err = MXRecLockTryAcquireInternal(lock);
@@ -297,15 +304,27 @@ MXRecLockAcquire(MXRecLock *lock)  // IN/OUT:
    if (err == 0) {
       MXRecLockIncCount(lock, 1);
 
-      return FALSE;  // Not contended
+      if (duration != NULL) {
+         *duration = 0ULL;
+      }
+
+      return;  // Uncontended
    }
 
    if (vmx86_debug && (err != EBUSY)) {
       Panic("%s: MXRecLockTryAcquireInternal error %d\n", __FUNCTION__, err);
    }
 
+   if (duration != NULL) {
+      start = Hostinfo_SystemTimerNS();
+   }
+
    err = MXRecLockAcquireInternal(lock);
 
+   if (duration != NULL) {
+      *duration = Hostinfo_SystemTimerNS() - start;
+   }
+
    if (vmx86_debug && (err != 0)) {
       Panic("%s: MXRecLockAcquireInternal error %d\n", __FUNCTION__, err);
    }
@@ -314,7 +333,7 @@ MXRecLockAcquire(MXRecLock *lock)  // IN/OUT:
 
    MXRecLockIncCount(lock, 1);
 
-   return TRUE;  // Contended
+   return;  // Contended
 }
 
 
@@ -348,7 +367,7 @@ static INLINE void
 MXRecLockDecCount(MXRecLock *lock,  // IN/OUT:
                   int count)        // IN:
 {
-   ASSERT(count > 0);
+   ASSERT(count >= 0);
 
    lock->referenceCount -= count;
 
index 8ec5cb7d9da0eab0efd4b27b050388caeb826536..9de2918701631728a5bf4af7db19dfec85b7cc4d 100644 (file)
@@ -735,30 +735,31 @@ MXUserAcquisition(MXUserRWLock *lock,  // IN/OUT:
    }
 
    if (vmx86_stats) {
-      Bool contended;
-      VmTimeType start = 0;
+      VmTimeType value;
       MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
 
-      if (LIKELY(stats != NULL)) {
-         start = Hostinfo_SystemTimerNS();
-      }
-
       if (lock->useNative) {
          int err = 0;
+         Bool contended;
+         VmTimeType begin = Hostinfo_SystemTimerNS();
 
          contended = MXUserNativeRWAcquire(&lock->nativeLock, forRead, &err);
 
+         value = contended ? Hostinfo_SystemTimerNS() - begin : 0;
+
          if (UNLIKELY(err != 0)) {
             MXUserDumpAndPanic(&lock->header, "%s: Error %d: contended %d\n",
                                __FUNCTION__, err, contended);
          }
       } else {
-         contended = MXRecLockAcquire(&lock->recursiveLock);
+         value = 0;
+
+         MXRecLockAcquire(&lock->recursiveLock,
+                          (stats == NULL) ? NULL : &value);
       }
 
       if (LIKELY(stats != NULL)) {
          MXUserHisto *histo;
-         VmTimeType value = Hostinfo_SystemTimerNS() - start;
 
          /*
           * The statistics are not atomically safe so protect them when
@@ -766,10 +767,11 @@ MXUserAcquisition(MXUserRWLock *lock,  // IN/OUT:
           */
 
          if (forRead && lock->useNative) {
-            MXRecLockAcquire(&lock->recursiveLock);
+            MXRecLockAcquire(&lock->recursiveLock,
+                             NULL);  // non-stats
          }
 
-         MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, contended,
+         MXUserAcquisitionSample(&stats->acquisitionStats, TRUE, value != 0,
                                  value);
 
          histo = Atomic_ReadPtr(&stats->acquisitionHisto);
@@ -795,7 +797,8 @@ MXUserAcquisition(MXUserRWLock *lock,  // IN/OUT:
                                __FUNCTION__, err);
          }
       } else {
-         MXRecLockAcquire(&lock->recursiveLock);
+         MXRecLockAcquire(&lock->recursiveLock,
+                          NULL);  // non-stats
       }
    }
 
@@ -940,7 +943,8 @@ MXUser_ReleaseRWLock(MXUserRWLock *lock)  // IN/OUT:
           */
 
          if ((myContext->state == RW_LOCKED_FOR_READ) && lock->useNative) {
-            MXRecLockAcquire(&lock->recursiveLock);
+            MXRecLockAcquire(&lock->recursiveLock,
+                             NULL);  // non-stats
          }
 
          MXUserBasicStatsSample(&stats->heldStats, duration);
index e5d125b82c54ec80b9aa74cddea568b1336963a2..ee07d00ea668f29f0524bec65f4770448b2e87f6 100644 (file)
@@ -521,23 +521,18 @@ MXUser_AcquireRecLock(MXUserRecLock *lock)  // IN/OUT:
       MXUserAcquisitionTracking(&lock->header, TRUE);
 
       if (vmx86_stats) {
-         Bool contended;
-         VmTimeType start = 0;
+         VmTimeType value = 0;
          MXUserStats *stats = Atomic_ReadPtr(&lock->statsMem);
 
-         if (LIKELY(stats != NULL)) {
-            start = Hostinfo_SystemTimerNS();
-         }
-
-         contended = MXRecLockAcquire(&lock->recursiveLock);
+         MXRecLockAcquire(&lock->recursiveLock,
+                          (stats == NULL) ? NULL : &value);
 
          if (LIKELY(stats != NULL)) {
             if (MXRecLockCount(&lock->recursiveLock) == 1) {
                MXUserHisto *histo;
-               VmTimeType value = Hostinfo_SystemTimerNS() - start;
 
                MXUserAcquisitionSample(&stats->acquisitionStats, TRUE,
-                                       contended, value);
+                                       value != 0, value);
 
                histo = Atomic_ReadPtr(&stats->acquisitionHisto);
 
@@ -549,7 +544,8 @@ MXUser_AcquireRecLock(MXUserRecLock *lock)  // IN/OUT:
             }
          }
       } else {
-         MXRecLockAcquire(&lock->recursiveLock);
+         MXRecLockAcquire(&lock->recursiveLock,
+                          NULL);  // non-stats
       }
    }
 
index 2bc66e1082ec0a95608fe3c4114fa5a614016659..4f9a98f216e4589e1e6a2dc0f23dddb23a55954f 100644 (file)
@@ -87,7 +87,8 @@ MXUserAddToList(MXUserHeader *header)  // IN:
 
    /* Tolerate a failure. This is too low down to log */
    if (listLock) {
-      MXRecLockAcquire(listLock);
+      MXRecLockAcquire(listLock,
+                       NULL);  // non-stats
       LIST_QUEUE(&header->item, &mxUserLockList);
       MXRecLockRelease(listLock);
    }
@@ -117,7 +118,8 @@ MXUserRemoveFromList(MXUserHeader *header)  // IN:
 
    /* Tolerate a failure. This is too low down to log */
    if (listLock) {
-      MXRecLockAcquire(listLock);
+      MXRecLockAcquire(listLock,
+                       NULL);  // non-stats
       LIST_DEL(&header->item, &mxUserLockList);
       MXRecLockRelease(listLock);
    }