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 ****************************************************************/
24 /* Hmm, needed for KDBG := 1. Why? */
25 #undef KeGetCurrentIrql
27 /* FUNCTIONS ***************************************************************/
29 #undef KeAcquireSpinLock
36 * FUNCTION: Acquires a spinlock
38 * SpinLock = Spinlock to acquire
39 * OldIrql (OUT) = Caller supplied storage for the previous irql
42 *OldIrql
= KfAcquireSpinLock(SpinLock
);
46 KeAcquireSpinLockRaiseToSynch (
52 OldIrql
= KfRaiseIrql(CLOCK2_LEVEL
);
53 KiAcquireSpinLock(SpinLock
);
58 #undef KeReleaseSpinLock
65 * FUNCTION: Releases a spinlock
67 * SpinLock = Spinlock to release
68 * NewIrql = Irql level before acquiring the spinlock
71 KfReleaseSpinLock(SpinLock
, NewIrql
);
81 ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL
);
83 OldIrql
= KfRaiseIrql(DISPATCH_LEVEL
);
84 KiAcquireSpinLock(SpinLock
);
95 * FUNCTION: Releases a spinlock
97 * SpinLock = Spinlock to release
98 * NewIrql = Irql level before acquiring the spinlock
101 ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL
|| KeGetCurrentIrql() == SYNCH_LEVEL
);
102 KiReleaseSpinLock(SpinLock
);
103 KfLowerIrql(NewIrql
);
112 KeAcquireInStackQueuedSpinLock(
113 IN PKSPIN_LOCK SpinLock
,
114 IN PKLOCK_QUEUE_HANDLE LockHandle
126 KeReleaseInStackQueuedSpinLock(
127 IN PKLOCK_QUEUE_HANDLE LockHandle