3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/hal/x86/spinlock.c
6 * PURPOSE: Implements spinlocks
7 * PROGRAMMER: David Welch (welch@cwcom.net)
8 * Eric Kohl (ekohl@rz-online.de)
14 * NOTE: On a uniprocessor machine spinlocks are implemented by raising
18 /* INCLUDES ****************************************************************/
23 /* Hmm, needed for KDBG := 1. Why? */
24 #undef KeGetCurrentIrql
26 /* FUNCTIONS ***************************************************************/
28 #undef KeAcquireSpinLock
35 * FUNCTION: Acquires a spinlock
37 * SpinLock = Spinlock to acquire
38 * OldIrql (OUT) = Caller supplied storage for the previous irql
41 *OldIrql
= KfAcquireSpinLock(SpinLock
);
45 KeAcquireSpinLockRaiseToSynch (
51 OldIrql
= KfRaiseIrql(SYNCH_LEVEL
);
52 KiAcquireSpinLock(SpinLock
);
57 #undef KeReleaseSpinLock
64 * FUNCTION: Releases a spinlock
66 * SpinLock = Spinlock to release
67 * NewIrql = Irql level before acquiring the spinlock
70 KfReleaseSpinLock(SpinLock
, NewIrql
);
80 ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL
);
82 OldIrql
= KfRaiseIrql(DISPATCH_LEVEL
);
83 KiAcquireSpinLock(SpinLock
);
94 * FUNCTION: Releases a spinlock
96 * SpinLock = Spinlock to release
97 * NewIrql = Irql level before acquiring the spinlock
100 ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL
|| KeGetCurrentIrql() == SYNCH_LEVEL
);
101 KiReleaseSpinLock(SpinLock
);
102 KfLowerIrql(NewIrql
);
111 KeAcquireInStackQueuedSpinLock(
112 IN PKSPIN_LOCK SpinLock
,
113 IN PKLOCK_QUEUE_HANDLE LockHandle
125 KeReleaseInStackQueuedSpinLock(
126 IN PKLOCK_QUEUE_HANDLE LockHandle