]> git.ipfire.org Git - thirdparty/open-vm-tools.git/commitdiff
lib/lock: restore lost fix
authorVMware, Inc <>
Wed, 21 Dec 2011 23:58:31 +0000 (15:58 -0800)
committerMarcelo Vanzin <mvanzin@vmware.com>
Wed, 21 Dec 2011 23:58:31 +0000 (15:58 -0800)
An earlier fix was lost. Put it back.

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

index adaee56d6c32e79b2235a1f63198c2f80188c770..51bdd4ad31dc80d223d3aff5211c82db66de5b57 100644 (file)
@@ -603,9 +603,13 @@ MXUser_ReleaseRecLock(MXUserRecLock *lock)  // IN/OUT:
       MXRecLockRelease(&lock->recursiveLock);
    }
 
-   if (Atomic_FetchAndDec(&lock->refCount) == 1) {
-      Panic("%s: Zero reference count upon exit\n", __FUNCTION__);
-   }
+   /*
+    * Don't screw up the reference count! When this is the last reference
+    * the lock will self destruct on a release if it is the last "hold"
+    * of the lock.
+    */
+
+   MXUserCondDestroyRecLock(lock);
 }
 
 
@@ -649,7 +653,8 @@ MXUser_TryAcquireRecLock(MXUserRecLock *lock)  // IN/OUT:
       MXUserStats *stats;
 
       if (MXUserTryAcquireFail(lock->header.name)) {
-         return FALSE;
+         success = FALSE;
+         goto bail;
       }
 
       success = MXRecLockTryAcquire(&lock->recursiveLock);
@@ -666,6 +671,8 @@ MXUser_TryAcquireRecLock(MXUserRecLock *lock)  // IN/OUT:
       }
    }
 
+bail:
+
    if (Atomic_FetchAndDec(&lock->refCount) == 1) {
       Panic("%s: Zero reference count upon exit\n", __FUNCTION__);
    }