https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5f1fff696bbc49163eaa709c8e53ae507cc2c196

commit 5f1fff696bbc49163eaa709c8e53ae507cc2c196
Author:     Thomas Faber <[email protected]>
AuthorDate: Sat Jan 28 21:54:05 2023 -0500
Commit:     Thomas Faber <[email protected]>
CommitDate: Sat Jan 28 23:26:30 2023 -0500

    [KMTESTS:KE] Correctly handle MP builds in KeSpinLock test.
---
 modules/rostests/kmtests/ntos_ke/KeSpinLock.c | 38 ++++++++++++++++++++-------
 1 file changed, 28 insertions(+), 10 deletions(-)

diff --git a/modules/rostests/kmtests/ntos_ke/KeSpinLock.c 
b/modules/rostests/kmtests/ntos_ke/KeSpinLock.c
index 9b16648573f..32f5b8ce351 100644
--- a/modules/rostests/kmtests/ntos_ke/KeSpinLock.c
+++ b/modules/rostests/kmtests/ntos_ke/KeSpinLock.c
@@ -1,8 +1,9 @@
 /*
- * PROJECT:         ReactOS kernel-mode tests
- * LICENSE:         GPLv2+ - See COPYING in the top level directory
- * PURPOSE:         Kernel-Mode Test Suite Spin lock test
- * PROGRAMMER:      Thomas Faber <[email protected]>
+ * PROJECT:     ReactOS kernel-mode tests
+ * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE:     Kernel-Mode Test Suite Spin lock test
+ * COPYRIGHT:   Copyright 2011-2023 Thomas Faber ([email protected])
+ * COPYRIGHT:   Copyright 2021 Jérôme Gardou ([email protected])
  */
 
 #ifndef _WIN64
@@ -265,13 +266,21 @@ TestSpinLock(
         CheckSpinLock(SpinLock, CheckData, 0);
         ok_bool_true(CheckData->TryAcquire(SpinLock, CheckData), "TryAcquire 
returned");
         CheckSpinLock(SpinLock, CheckData, 1);
+        /* A second TryToAcquire results in SPINLOCK_ALREADY_OWNED on checked 
builds */
         if (!KmtIsCheckedBuild)
         {
-            /* SPINLOCK_ALREADY_OWNED on checked build */
-            ok_bool_true(CheckData->TryAcquire(SpinLock, CheckData), 
"TryAcquire returned");
-            /* even a failing acquire sets irql */
-            ok_eq_uint(CheckData->Irql, CheckData->IrqlWhenAcquired);
-            CheckData->Irql = CheckData->OriginalIrql;
+            if (KmtIsMultiProcessorBuild)
+            {
+                /* In MP, this fails as you would expect */
+                ok_bool_false(CheckData->TryAcquire(SpinLock, CheckData), 
"TryAcquire returned");
+            }
+            else
+            {
+                /* In UP, this always succeeds: recursive acquires are illegal 
and parallel processors don't exist */
+                ok_bool_true(CheckData->TryAcquire(SpinLock, CheckData), 
"TryAcquire returned");
+                ok_eq_uint(CheckData->Irql, CheckData->IrqlWhenAcquired);
+                CheckData->Irql = CheckData->OriginalIrql;
+            }
             CheckSpinLock(SpinLock, CheckData, 1);
         }
         CheckData->Release(SpinLock, CheckData);
@@ -312,7 +321,16 @@ TestSpinLock(
             CheckSpinLock(SpinLock, CheckData, 1);
             if (!KmtIsCheckedBuild)
             {
-                ok_bool_true(CheckData->TryAcquireNoRaise(SpinLock, 
CheckData), "TryAcquireNoRaise returned");
+                if (KmtIsMultiProcessorBuild)
+                {
+                    /* In MP, this fails as you would expect */
+                    ok_bool_false(CheckData->TryAcquireNoRaise(SpinLock, 
CheckData), "TryAcquireNoRaise returned");
+                }
+                else
+                {
+                    /* In UP, this always succeeds: recursive acquires are 
illegal and parallel processors don't exist */
+                    ok_bool_true(CheckData->TryAcquireNoRaise(SpinLock, 
CheckData), "TryAcquireNoRaise returned");
+                }
                 CheckSpinLock(SpinLock, CheckData, 1);
             }
             CheckData->ReleaseNoLower(SpinLock, CheckData);

Reply via email to