From 444bb36f82eb5a55ea68668166c10f65428de24b Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Thu, 5 Jan 2006 15:32:08 +0000 Subject: [PATCH] - Change dispatcher lock release to be more like documented in Windows Internals II and to allow an easier move to Queued Spinlock. svn path=/trunk/; revision=20579 --- reactos/ntoskrnl/include/internal/ke.h | 12 ++++++++---- reactos/ntoskrnl/ke/wait.c | 15 ++++----------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 30bf212a785..9c8a49ac060 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -51,6 +51,7 @@ extern ULONG_PTR KERNEL_BASE; #ifndef CONFIG_SMP #define KeInitializeDispatcher() #define KeAcquireDispatcherDatabaseLock() KeRaiseIrqlToDpcLevel(); +#define KeReleaseDispatcherDatabaseLock(OldIrql) KiExitDispatcher(OldIrql); #define KeAcquireDispatcherDatabaseLockAtDpcLevel() #define KeReleaseDispatcherDatabaseLockFromDpcLevel() #else @@ -60,6 +61,9 @@ extern ULONG_PTR KERNEL_BASE; KeAcquireSpinLockAtDpcLevel (&DispatcherDatabaseLock); #define KeReleaseDispatcherDatabaseLockFromDpcLevel() \ KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock); +#define KeReleaseDispatcherDatabaseLock(OldIrql) \ + KeReleaseSpinLockFromDpcLevel(&DispatcherDatabaseLock); \ + KiExitDispatcher(OldIrql); #endif /* The following macro initializes a dispatcher object's header */ @@ -259,6 +263,10 @@ VOID STDCALL KiAdjustQuantumThread(IN PKTHREAD Thread); +VOID +FASTCALL +KiExitDispatcher(KIRQL OldIrql); + /* gmutex.c ********************************************************************/ VOID @@ -386,10 +394,6 @@ KiExpireTimers( PVOID SystemArgument2 ); -VOID -FASTCALL -KeReleaseDispatcherDatabaseLock(KIRQL Irql); - VOID STDCALL KeInitializeThread( diff --git a/reactos/ntoskrnl/ke/wait.c b/reactos/ntoskrnl/ke/wait.c index 79b18f686d7..fad80d9c993 100644 --- a/reactos/ntoskrnl/ke/wait.c +++ b/reactos/ntoskrnl/ke/wait.c @@ -798,7 +798,7 @@ KiAcquireFastMutex(IN PFAST_MUTEX FastMutex) VOID FASTCALL -KeReleaseDispatcherDatabaseLock(KIRQL OldIrql) +KiExitDispatcher(KIRQL OldIrql) { /* If it's the idle thread, dispatch */ if (!(KeIsExecutingDpc()) && @@ -807,17 +807,10 @@ KeReleaseDispatcherDatabaseLock(KIRQL OldIrql) (KeGetCurrentThread() == KeGetCurrentPrcb()->IdleThread)) { KiDispatchThreadNoLock(Ready); - KeLowerIrql(OldIrql); - } - else - { - /* Just release the spin lock */ -#ifdef CONFIG_SMP - KeReleaseSpinLock(&DispatcherDatabaseLock, OldIrql); -#else - KeLowerIrql(OldIrql); -#endif } + + /* Lower irql back */ + KeLowerIrql(OldIrql); } /* EOF */