https://git.reactos.org/?p=reactos.git;a=commitdiff;h=40017a54f958093ee6a12c...
commit 40017a54f958093ee6a12cd73412aedbe44f0ea1 Author: Pierre Schweitzer pierre@reactos.org AuthorDate: Sun Apr 8 18:58:15 2018 +0200 Commit: Pierre Schweitzer pierre@reactos.org CommitDate: Sun Apr 15 22:52:53 2018 +0200
[NTOSKRNL] Use interlocked operations when dealing with map count.
CORE-14349 --- ntoskrnl/cc/view.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/ntoskrnl/cc/view.c b/ntoskrnl/cc/view.c index 1ec4c35b1f..cde1c2d6fa 100644 --- a/ntoskrnl/cc/view.c +++ b/ntoskrnl/cc/view.c @@ -344,7 +344,7 @@ retry: CcRosVacbIncRefCount(current);
/* Check if it's mapped and not dirty */ - if (current->MappedCount > 0 && !current->Dirty) + if (InterlockedCompareExchange((PLONG)¤t->MappedCount, 0, 0) > 0 && !current->Dirty) { /* We have to break these locks because Cc sucks */ KeReleaseSpinLock(¤t->SharedCacheMap->CacheMapLock, oldIrql); @@ -448,14 +448,13 @@ CcRosReleaseVacb (
if (Mapped) { - Vacb->MappedCount++; - } - Refs = CcRosVacbDecRefCount(Vacb); - if (Mapped && (Vacb->MappedCount == 1)) - { - CcRosVacbIncRefCount(Vacb); + if (InterlockedIncrement((PLONG)&Vacb->MappedCount) == 1) + { + CcRosVacbIncRefCount(Vacb); + } }
+ Refs = CcRosVacbDecRefCount(Vacb); ASSERT(Refs > 0);
CcRosReleaseVacbLock(Vacb); @@ -630,9 +629,7 @@ CcRosUnmapVacb ( }
ASSERT(Vacb->MappedCount != 0); - Vacb->MappedCount--; - - if (Vacb->MappedCount == 0) + if (InterlockedDecrement((PLONG)&Vacb->MappedCount) == 0) { CcRosVacbDecRefCount(Vacb); }