https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6b2f05f9ddfa65d2d83712d992d9f4e8dfa0ca74

commit 6b2f05f9ddfa65d2d83712d992d9f4e8dfa0ca74
Author:     Jérôme Gardou <jerome.gar...@reactos.org>
AuthorDate: Tue Feb 23 17:21:26 2021 +0100
Commit:     Jérôme Gardou <zefk...@users.noreply.github.com>
CommitDate: Tue May 4 12:02:41 2021 +0200

    [NTOS:MM] Implement turning working set shared lock to exclusive
---
 ntoskrnl/mm/ARM3/miarm.h | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/ntoskrnl/mm/ARM3/miarm.h b/ntoskrnl/mm/ARM3/miarm.h
index 7de6227f5a1..84357d1e7ea 100644
--- a/ntoskrnl/mm/ARM3/miarm.h
+++ b/ntoskrnl/mm/ARM3/miarm.h
@@ -1398,6 +1398,46 @@ MiUnlockWorkingSetShared(
     KeLeaveGuardedRegion();
 }
 
+FORCEINLINE
+BOOLEAN
+MiConvertSharedWorkingSetLockToExclusive(
+    _In_ PETHREAD Thread,
+    _In_ PMMSUPPORT Vm)
+{
+    /* Sanity check: No exclusive lock. */
+    ASSERT(!Thread->OwnsProcessWorkingSetExclusive);
+    ASSERT(!Thread->OwnsSessionWorkingSetExclusive);
+    ASSERT(!Thread->OwnsSystemWorkingSetExclusive);
+
+    /* And it should have one and only one shared lock */
+    ASSERT((Thread->OwnsProcessWorkingSetShared + 
Thread->OwnsSessionWorkingSetShared + Thread->OwnsSystemWorkingSetShared) == 1);
+
+    /* Try. */
+    if (!ExConvertPushLockSharedToExclusive(&Vm->WorkingSetMutex))
+        return FALSE;
+
+    if (Vm == &MmSystemCacheWs)
+    {
+        ASSERT(Thread->OwnsSystemWorkingSetShared);
+        Thread->OwnsSystemWorkingSetShared = FALSE;
+        Thread->OwnsSystemWorkingSetExclusive = TRUE;
+    }
+    else if (Vm->Flags.SessionSpace)
+    {
+        ASSERT(Thread->OwnsSessionWorkingSetShared);
+        Thread->OwnsSessionWorkingSetShared = FALSE;
+        Thread->OwnsSessionWorkingSetExclusive = TRUE;
+    }
+    else
+    {
+        ASSERT(Thread->OwnsProcessWorkingSetShared);
+        Thread->OwnsProcessWorkingSetShared = FALSE;
+        Thread->OwnsProcessWorkingSetExclusive = TRUE;
+    }
+
+    return TRUE;
+}
+
 FORCEINLINE
 VOID
 MiUnlockProcessWorkingSetForFault(IN PEPROCESS Process,

Reply via email to