2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: hal/halx86/mp/spinlock.c
5 * PURPOSE: Implements spinlocks
6 * PROGRAMMER: David Welch (welch@cwcom.net)
13 * NOTE: On a uniprocessor machine spinlocks are implemented by raising
17 /* 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(CLOCK2_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
);
75 KeTryToAcquireQueuedSpinLock(
76 KSPIN_LOCK_QUEUE_NUMBER LockNumber
,
87 KeTryToAcquireQueuedSpinLockRaiseToSynch(
88 KSPIN_LOCK_QUEUE_NUMBER LockNumber
,
103 ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL
);
105 OldIrql
= KfRaiseIrql(DISPATCH_LEVEL
);
106 KiAcquireSpinLock(SpinLock
);
113 PKSPIN_LOCK SpinLock
,
117 * FUNCTION: Releases a spinlock
119 * SpinLock = Spinlock to release
120 * NewIrql = Irql level before acquiring the spinlock
123 ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL
|| KeGetCurrentIrql() == SYNCH_LEVEL
);
124 KiReleaseSpinLock(SpinLock
);
125 KfLowerIrql(NewIrql
);
134 KeAcquireInStackQueuedSpinLock(
135 IN PKSPIN_LOCK SpinLock
,
136 IN PKLOCK_QUEUE_HANDLE LockHandle
147 KeAcquireInStackQueuedSpinLockRaiseToSynch(
148 IN PKSPIN_LOCK SpinLock
,
149 IN PKLOCK_QUEUE_HANDLE LockHandle
161 KeReleaseInStackQueuedSpinLock(
162 IN PKLOCK_QUEUE_HANDLE LockHandle
173 KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER Number
)
184 KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber
)
195 KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER Number
,