From: Jeffrey Altman Date: Fri, 22 Mar 2013 04:54:36 +0000 (-0400) Subject: Windows: AFSDeleteObjectInfo InterlockedExchange X-Git-Tag: upstream/1.8.0_pre1^2~1279 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=ef5ea5120ea0af85d73fa7588dd0efc947a174d9;p=packages%2Fo%2Fopenafs.git Windows: AFSDeleteObjectInfo InterlockedExchange Use InterlockedExchangePointer to disconnect the ObjectInformationCB pointer from the caller. This ensures that only one thread can successfully call AFSDeleteObjectInfo on the same object at a time. Change-Id: Ie70f52fc443f88c3cb4be41f12caa91466d92905 Reviewed-on: http://gerrit.openafs.org/9644 Tested-by: BuildBot Reviewed-by: Peter Scott Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp index d607b4f42..1854c0c4b 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSGeneric.cpp @@ -6822,13 +6822,13 @@ AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo) { BOOLEAN bAcquiredTreeLock = FALSE; - AFSObjectInfoCB *pObjectInfo = (*ppObjectInfo); - BOOLEAN bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE); + AFSObjectInfoCB *pObjectInfo = NULL; + BOOLEAN bHeldInService; AFSObjectInfoCB * pParentObjectInfo = NULL; AFSFileID FileId; LONG lCount; - if ( BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_ROOT_VOLUME)) + if ( BooleanFlagOn( (*ppObjectInfo)->Flags, AFS_OBJECT_ROOT_VOLUME)) { // @@ -6841,9 +6841,19 @@ AFSDeleteObjectInfo( IN AFSObjectInfoCB **ppObjectInfo) return; } + pObjectInfo = (AFSObjectInfoCB *) InterlockedCompareExchangePointer( (PVOID *)ppObjectInfo, + NULL, + (PVOID *)ppObjectInfo); + + if ( pObjectInfo == NULL) + { + + return; + } + ASSERT( pObjectInfo->ObjectReferenceCount == 0); - (*ppObjectInfo) = NULL; + bHeldInService = BooleanFlagOn( pObjectInfo->Flags, AFS_OBJECT_HELD_IN_SERVICE); if( !ExIsResourceAcquiredExclusiveLite( pObjectInfo->VolumeCB->ObjectInfoTree.TreeLock)) {