https://git.reactos.org/?p=reactos.git;a=commitdiff;h=40017a54f958093ee6a12cd73412aedbe44f0ea1

commit 40017a54f958093ee6a12cd73412aedbe44f0ea1
Author:     Pierre Schweitzer <[email protected]>
AuthorDate: Sun Apr 8 18:58:15 2018 +0200
Commit:     Pierre Schweitzer <[email protected]>
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)&current->MappedCount, 0, 0) > 0 
&& !current->Dirty)
         {
             /* We have to break these locks because Cc sucks */
             KeReleaseSpinLock(&current->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);
     }

Reply via email to