From: VMware, Inc <> Date: Wed, 21 Dec 2011 23:58:31 +0000 (-0800) Subject: lib/lock: restore lost fix X-Git-Tag: 2011.12.20-562307~69 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7c96b254ae1387dd2d1ba3c953f11d6072ea0328;p=thirdparty%2Fopen-vm-tools.git lib/lock: restore lost fix An earlier fix was lost. Put it back. Signed-off-by: Marcelo Vanzin --- diff --git a/open-vm-tools/lib/lock/ulRec.c b/open-vm-tools/lib/lock/ulRec.c index adaee56d6..51bdd4ad3 100644 --- a/open-vm-tools/lib/lock/ulRec.c +++ b/open-vm-tools/lib/lock/ulRec.c @@ -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__); }