From 2a6c4f11194b4f0fca8d6f8a9da4a623147be459 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 24 Jul 2016 17:10:30 +0000 Subject: [PATCH] [NTOS:CC] - Centralize VACB locking/unlocking into inline functions for easier instrumentation svn path=/trunk/; revision=71991 --- reactos/ntoskrnl/cc/pin.c | 22 ++++----------- reactos/ntoskrnl/cc/view.c | 39 ++++++++------------------ reactos/ntoskrnl/include/internal/cc.h | 23 +++++++++++++++ 3 files changed, 40 insertions(+), 44 deletions(-) diff --git a/reactos/ntoskrnl/cc/pin.c b/reactos/ntoskrnl/cc/pin.c index 3779f6407e2..9159745fb08 100644 --- a/reactos/ntoskrnl/cc/pin.c +++ b/reactos/ntoskrnl/cc/pin.c @@ -187,7 +187,7 @@ CcPinRead ( iBcb->Pinned = TRUE; if (InterlockedIncrement(&iBcb->Vacb->PinCount) == 1) { - KeReleaseMutex(&iBcb->Vacb->Mutex, FALSE); + CcRosReleaseVacbLock(iBcb->Vacb); } if (Flags & PIN_EXCLUSIVE) @@ -283,11 +283,7 @@ CcUnpinDataForThread ( iBcb->Pinned = FALSE; if (InterlockedDecrement(&iBcb->Vacb->PinCount) == 0) { - KeWaitForSingleObject(&iBcb->Vacb->Mutex, - Executive, - KernelMode, - FALSE, - NULL); + CcRosAcquireVacbLock(iBcb->Vacb, NULL); } } @@ -339,11 +335,7 @@ CcUnpinRepinnedBcb ( IoStatus->Information = 0; if (WriteThrough) { - KeWaitForSingleObject(&iBcb->Vacb->Mutex, - Executive, - KernelMode, - FALSE, - NULL); + CcRosAcquireVacbLock(iBcb->Vacb, NULL); if (iBcb->Vacb->Dirty) { IoStatus->Status = CcRosFlushVacb(iBcb->Vacb); @@ -352,7 +344,7 @@ CcUnpinRepinnedBcb ( { IoStatus->Status = STATUS_SUCCESS; } - KeReleaseMutex(&iBcb->Vacb->Mutex, FALSE); + CcRosReleaseVacbLock(iBcb->Vacb); } else { @@ -365,11 +357,7 @@ CcUnpinRepinnedBcb ( iBcb->Pinned = FALSE; if (InterlockedDecrement(&iBcb->Vacb->PinCount) == 0) { - KeWaitForSingleObject(&iBcb->Vacb->Mutex, - Executive, - KernelMode, - FALSE, - NULL); + CcRosAcquireVacbLock(iBcb->Vacb, NULL); } } ExDeleteResourceLite(&iBcb->Lock); diff --git a/reactos/ntoskrnl/cc/view.c b/reactos/ntoskrnl/cc/view.c index df7060f658d..825dffec46e 100644 --- a/reactos/ntoskrnl/cc/view.c +++ b/reactos/ntoskrnl/cc/view.c @@ -199,11 +199,8 @@ CcRosFlushDirtyPages ( continue; } - Status = KeWaitForSingleObject(¤t->Mutex, - Executive, - KernelMode, - FALSE, - Wait ? NULL : &ZeroTimeout); + Status = CcRosAcquireVacbLock(current, + Wait ? NULL : &ZeroTimeout); if (Status != STATUS_SUCCESS) { current->SharedCacheMap->Callbacks->ReleaseFromLazyWrite( @@ -217,7 +214,7 @@ CcRosFlushDirtyPages ( /* One reference is added above */ if (current->ReferenceCount > 2) { - KeReleaseMutex(¤t->Mutex, FALSE); + CcRosReleaseVacbLock(current); current->SharedCacheMap->Callbacks->ReleaseFromLazyWrite( current->SharedCacheMap->LazyWriteContext); CcRosVacbDecRefCount(current); @@ -228,7 +225,7 @@ CcRosFlushDirtyPages ( Status = CcRosFlushVacb(current); - KeReleaseMutex(¤t->Mutex, FALSE); + CcRosReleaseVacbLock(current); current->SharedCacheMap->Callbacks->ReleaseFromLazyWrite( current->SharedCacheMap->LazyWriteContext); @@ -427,7 +424,7 @@ CcRosReleaseVacb ( KeReleaseGuardedMutex(&ViewLock); if (InterlockedCompareExchange(&Vacb->PinCount, 0, 0) == 0) { - KeReleaseMutex(&Vacb->Mutex, FALSE); + CcRosReleaseVacbLock(Vacb); } return STATUS_SUCCESS; @@ -467,11 +464,7 @@ CcRosLookupVacb ( KeReleaseGuardedMutex(&ViewLock); if (InterlockedCompareExchange(¤t->PinCount, 0, 0) == 0) { - KeWaitForSingleObject(¤t->Mutex, - Executive, - KernelMode, - FALSE, - NULL); + CcRosAcquireVacbLock(current, NULL); } return current; } @@ -527,7 +520,7 @@ CcRosMarkDirtyVacb ( KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql); KeReleaseGuardedMutex(&ViewLock); - KeReleaseMutex(&Vacb->Mutex, FALSE); + CcRosReleaseVacbLock(Vacb); return STATUS_SUCCESS; } @@ -580,7 +573,7 @@ CcRosUnmapVacb ( KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldIrql); KeReleaseGuardedMutex(&ViewLock); - KeReleaseMutex(&Vacb->Mutex, FALSE); + CcRosReleaseVacbLock(Vacb); return STATUS_SUCCESS; } @@ -683,11 +676,7 @@ CcRosCreateVacb ( current->ReferenceCount = 1; current->PinCount = 0; KeInitializeMutex(¤t->Mutex, 0); - KeWaitForSingleObject(¤t->Mutex, - Executive, - KernelMode, - FALSE, - NULL); + CcRosAcquireVacbLock(current, NULL); KeAcquireGuardedMutex(&ViewLock); *Vacb = current; @@ -719,17 +708,13 @@ CcRosCreateVacb ( current); } #endif - KeReleaseMutex(&(*Vacb)->Mutex, FALSE); + CcRosReleaseVacbLock(*Vacb); KeReleaseGuardedMutex(&ViewLock); ExFreeToNPagedLookasideList(&VacbLookasideList, *Vacb); *Vacb = current; if (InterlockedCompareExchange(¤t->PinCount, 0, 0) == 0) { - KeWaitForSingleObject(¤t->Mutex, - Executive, - KernelMode, - FALSE, - NULL); + CcRosAcquireVacbLock(current, NULL); } return STATUS_SUCCESS; } @@ -962,7 +947,7 @@ CcFlushCache ( if (InterlockedCompareExchange(¤t->PinCount, 0, 0) == 0) { - KeReleaseMutex(¤t->Mutex, FALSE); + CcRosReleaseVacbLock(current); } KeAcquireGuardedMutex(&ViewLock); diff --git a/reactos/ntoskrnl/include/internal/cc.h b/reactos/ntoskrnl/include/internal/cc.h index ece2001635d..40bd6bd3e33 100644 --- a/reactos/ntoskrnl/include/internal/cc.h +++ b/reactos/ntoskrnl/include/internal/cc.h @@ -340,6 +340,29 @@ NTSTATUS NTAPI CcTryToInitializeFileCache(PFILE_OBJECT FileObject); +FORCEINLINE +NTSTATUS +CcRosAcquireVacbLock( + _Inout_ PROS_VACB Vacb, + _In_ PLARGE_INTEGER Timeout) +{ + NTSTATUS Status; + Status = KeWaitForSingleObject(&Vacb->Mutex, + Executive, + KernelMode, + FALSE, + Timeout); + return Status; +} + +FORCEINLINE +VOID +CcRosReleaseVacbLock( + _Inout_ PROS_VACB Vacb) +{ + KeReleaseMutex(&Vacb->Mutex, FALSE); +} + FORCEINLINE BOOLEAN DoRangesIntersect(