From 5857dd36b2b129fd2cf187650723b896c24f5177 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 19 Oct 2012 11:26:21 -0400 Subject: [PATCH] Windows: ObjectInfo RefCount 0 <-> 1 transitions When the reference count transitions from 0 <-> 1 ensure that the ObjectInfoLock is held exclusive to prevent the current thread from altering the state while another thread is holding the ObjectInfoLock shared in order to conditionally perform an action based upon the the reference count being zero. Change-Id: I5bcf384a0ea90e4896e55b537e92112ac3791a4c Reviewed-on: http://gerrit.openafs.org/8257 Reviewed-by: Rod Widdowson Tested-by: BuildBot Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp | 40 ++++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index fc85688c0..6a7a9388d 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -6543,10 +6543,31 @@ AFSObjectInfoIncrement( IN AFSObjectInfoCB *ObjectInfo) LONG lCount; - AFSAcquireShared( &ObjectInfo->NonPagedInfo->ObjectInfoLock, - TRUE); + if ( ObjectInfo->ObjectReferenceCount == 0) + { + + AFSAcquireExcl( &ObjectInfo->NonPagedInfo->ObjectInfoLock, + TRUE); + + lCount = InterlockedIncrement( &ObjectInfo->ObjectReferenceCount); + } + else + { + + AFSAcquireShared( &ObjectInfo->NonPagedInfo->ObjectInfoLock, + TRUE); + + lCount = InterlockedIncrement( &ObjectInfo->ObjectReferenceCount); + + if ( lCount == 1) + { - lCount = InterlockedIncrement( &ObjectInfo->ObjectReferenceCount); + AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock); + + AFSAcquireExcl( &ObjectInfo->NonPagedInfo->ObjectInfoLock, + TRUE); + } + } AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock); @@ -6564,6 +6585,19 @@ AFSObjectInfoDecrement( IN AFSObjectInfoCB *ObjectInfo) lCount = InterlockedDecrement( &ObjectInfo->ObjectReferenceCount); + if ( lCount == 0) + { + + lCount = InterlockedIncrement( &ObjectInfo->ObjectReferenceCount); + + AFSReleaseResource(&ObjectInfo->NonPagedInfo->ObjectInfoLock); + + AFSAcquireExcl( &ObjectInfo->NonPagedInfo->ObjectInfoLock, + TRUE); + + lCount = InterlockedDecrement( &ObjectInfo->ObjectReferenceCount); + } + AFSReleaseResource( &ObjectInfo->NonPagedInfo->ObjectInfoLock); return lCount; -- 2.39.5