https://git.reactos.org/?p=reactos.git;a=commitdiff;h=40017a54f958093ee6a12…
commit 40017a54f958093ee6a12cd73412aedbe44f0ea1
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Sun Apr 8 18:58:15 2018 +0200
Commit: Pierre Schweitzer <pierre(a)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);
}