diff --git a/reactos/ntoskrnl/cc/pin.c b/reactos/ntoskrnl/cc/pin.c index 9159745fb08..6a0d6758caf 100644 --- a/reactos/ntoskrnl/cc/pin.c +++ b/reactos/ntoskrnl/cc/pin.c @@ -185,10 +185,8 @@ CcPinRead ( ASSERT(iBcb->Pinned == FALSE); iBcb->Pinned = TRUE; - if (InterlockedIncrement(&iBcb->Vacb->PinCount) == 1) - { - CcRosReleaseVacbLock(iBcb->Vacb); - } + iBcb->Vacb->PinCount++; + CcRosReleaseVacbLock(iBcb->Vacb); if (Flags & PIN_EXCLUSIVE) { @@ -281,10 +279,8 @@ CcUnpinDataForThread ( { ExReleaseResourceForThreadLite(&iBcb->Lock, ResourceThreadId); iBcb->Pinned = FALSE; - if (InterlockedDecrement(&iBcb->Vacb->PinCount) == 0) - { - CcRosAcquireVacbLock(iBcb->Vacb, NULL); - } + CcRosAcquireVacbLock(iBcb->Vacb, NULL); + iBcb->Vacb->PinCount--; } CcRosReleaseVacb(iBcb->Vacb->SharedCacheMap, @@ -355,10 +351,8 @@ CcUnpinRepinnedBcb ( { ExReleaseResourceLite(&iBcb->Lock); iBcb->Pinned = FALSE; - if (InterlockedDecrement(&iBcb->Vacb->PinCount) == 0) - { - CcRosAcquireVacbLock(iBcb->Vacb, NULL); - } + CcRosAcquireVacbLock(iBcb->Vacb, NULL); + iBcb->Vacb->PinCount--; } ExDeleteResourceLite(&iBcb->Lock); ExFreeToNPagedLookasideList(&iBcbLookasideList, iBcb); diff --git a/reactos/ntoskrnl/cc/view.c b/reactos/ntoskrnl/cc/view.c index 825dffec46e..295471d8ebc 100644 --- a/reactos/ntoskrnl/cc/view.c +++ b/reactos/ntoskrnl/cc/view.c @@ -422,10 +422,7 @@ CcRosReleaseVacb ( KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql); KeReleaseGuardedMutex(&ViewLock); - if (InterlockedCompareExchange(&Vacb->PinCount, 0, 0) == 0) - { - CcRosReleaseVacbLock(Vacb); - } + CcRosReleaseVacbLock(Vacb); return STATUS_SUCCESS; } @@ -462,10 +459,7 @@ CcRosLookupVacb ( CcRosVacbIncRefCount(current); KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql); KeReleaseGuardedMutex(&ViewLock); - if (InterlockedCompareExchange(¤t->PinCount, 0, 0) == 0) - { - CcRosAcquireVacbLock(current, NULL); - } + CcRosAcquireVacbLock(current, NULL); return current; } if (current->FileOffset.QuadPart > FileOffset) @@ -712,10 +706,7 @@ CcRosCreateVacb ( KeReleaseGuardedMutex(&ViewLock); ExFreeToNPagedLookasideList(&VacbLookasideList, *Vacb); *Vacb = current; - if (InterlockedCompareExchange(¤t->PinCount, 0, 0) == 0) - { - CcRosAcquireVacbLock(current, NULL); - } + CcRosAcquireVacbLock(current, NULL); return STATUS_SUCCESS; } if (current->FileOffset.QuadPart < FileOffset) @@ -945,10 +936,7 @@ CcFlushCache ( } } - if (InterlockedCompareExchange(¤t->PinCount, 0, 0) == 0) - { - CcRosReleaseVacbLock(current); - } + CcRosReleaseVacbLock(current); KeAcquireGuardedMutex(&ViewLock); KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldIrql); diff --git a/reactos/ntoskrnl/include/internal/cc.h b/reactos/ntoskrnl/include/internal/cc.h index 40bd6bd3e33..9004041ad73 100644 --- a/reactos/ntoskrnl/include/internal/cc.h +++ b/reactos/ntoskrnl/include/internal/cc.h @@ -185,7 +185,8 @@ typedef struct _ROS_VACB /* Number of references. */ ULONG ReferenceCount; /* How many times was it pinned? */ - volatile LONG PinCount; + _Guarded_by_(Mutex) + LONG PinCount; /* Pointer to the shared cache map for the file which this view maps data for. */ PROS_SHARED_CACHE_MAP SharedCacheMap; /* Pointer to the next VACB in a chain. */