Merge 14981:15268 from trunk
[reactos.git] / reactos / hal / halx86 / generic / spinlock.c
1 /* $Id$
2 *
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)
9 * UPDATE HISTORY:
10 * 09/06/2000 Created
11 */
12
13 /*
14 * NOTE: On a uniprocessor machine spinlocks are implemented by raising
15 * the irq level
16 */
17
18 /* INCLUDES ****************************************************************/
19
20 #include <ddk/ntddk.h>
21
22 #include <internal/debug.h>
23
24 /* Hmm, needed for KDBG := 1. Why? */
25 #undef KeGetCurrentIrql
26
27 /* FUNCTIONS ***************************************************************/
28
29 VOID STDCALL
30 KeAcquireSpinLock (
31 PKSPIN_LOCK SpinLock,
32 PKIRQL OldIrql
33 )
34 /*
35 * FUNCTION: Acquires a spinlock
36 * ARGUMENTS:
37 * SpinLock = Spinlock to acquire
38 * OldIrql (OUT) = Caller supplied storage for the previous irql
39 */
40 {
41 *OldIrql = KfAcquireSpinLock(SpinLock);
42 }
43
44 KIRQL FASTCALL
45 KeAcquireSpinLockRaiseToSynch (
46 PKSPIN_LOCK SpinLock
47 )
48 {
49 KIRQL OldIrql;
50
51 OldIrql = KfRaiseIrql(SYNCH_LEVEL);
52 KiAcquireSpinLock(SpinLock);
53
54 return OldIrql;
55 }
56
57 VOID STDCALL
58 KeReleaseSpinLock (
59 PKSPIN_LOCK SpinLock,
60 KIRQL NewIrql
61 )
62 /*
63 * FUNCTION: Releases a spinlock
64 * ARGUMENTS:
65 * SpinLock = Spinlock to release
66 * NewIrql = Irql level before acquiring the spinlock
67 */
68 {
69 KfReleaseSpinLock(SpinLock, NewIrql);
70 }
71
72 KIRQL FASTCALL
73 KfAcquireSpinLock (
74 PKSPIN_LOCK SpinLock
75 )
76 {
77 KIRQL OldIrql;
78
79 ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
80
81 OldIrql = KfRaiseIrql(DISPATCH_LEVEL);
82 KiAcquireSpinLock(SpinLock);
83
84 return OldIrql;
85 }
86
87 VOID FASTCALL
88 KfReleaseSpinLock (
89 PKSPIN_LOCK SpinLock,
90 KIRQL NewIrql
91 )
92 /*
93 * FUNCTION: Releases a spinlock
94 * ARGUMENTS:
95 * SpinLock = Spinlock to release
96 * NewIrql = Irql level before acquiring the spinlock
97 */
98 {
99 ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL || KeGetCurrentIrql() == SYNCH_LEVEL);
100 KiReleaseSpinLock(SpinLock);
101 KfLowerIrql(NewIrql);
102 }
103
104
105 /*
106 * @unimplemented
107 */
108 VOID
109 FASTCALL
110 KeAcquireInStackQueuedSpinLock(
111 IN PKSPIN_LOCK SpinLock,
112 IN PKLOCK_QUEUE_HANDLE LockHandle
113 )
114 {
115 UNIMPLEMENTED;
116 }
117
118
119 /*
120 * @unimplemented
121 */
122 VOID
123 FASTCALL
124 KeReleaseInStackQueuedSpinLock(
125 IN PKLOCK_QUEUE_HANDLE LockHandle
126 )
127 {
128 UNIMPLEMENTED;
129 }
130
131 /* EOF */