+User acceptable message on incompatible W32 binary modules.
[reactos.git] / hal / halx86 / 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 /* FUNCTIONS ***************************************************************/
25
26 VOID STDCALL
27 KeAcquireSpinLock (
28         PKSPIN_LOCK     SpinLock,
29         PKIRQL          OldIrql
30         )
31 /*
32  * FUNCTION: Acquires a spinlock
33  * ARGUMENTS:
34  *         SpinLock = Spinlock to acquire
35  *         OldIrql (OUT) = Caller supplied storage for the previous irql
36  */
37 {
38    KeRaiseIrql(DISPATCH_LEVEL,OldIrql);
39    KeAcquireSpinLockAtDpcLevel(SpinLock);
40 }
41
42 #ifndef LIBCAPTIVE
43
44 KIRQL FASTCALL
45 KeAcquireSpinLockRaiseToSynch (
46         PKSPIN_LOCK     SpinLock
47         )
48 {
49   ASSERT_IRQL(SYNCH_LEVEL);
50   KeAcquireSpinLockAtDpcLevel(SpinLock);
51 }
52
53 #endif /* LIBCAPTIVE */
54
55 VOID STDCALL
56 KeReleaseSpinLock (
57         PKSPIN_LOCK     SpinLock,
58         KIRQL           NewIrql
59         )
60 /*
61  * FUNCTION: Releases a spinlock
62  * ARGUMENTS:
63  *        SpinLock = Spinlock to release
64  *        NewIrql = Irql level before acquiring the spinlock
65  */
66 {
67    KeReleaseSpinLockFromDpcLevel(SpinLock);
68    KeLowerIrql(NewIrql);
69 }
70
71 KIRQL FASTCALL
72 KfAcquireSpinLock (
73         PKSPIN_LOCK     SpinLock
74         )
75 {
76    KIRQL OldIrql;
77
78    KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
79    KeAcquireSpinLockAtDpcLevel(SpinLock);
80
81    return OldIrql;
82 }
83
84 VOID FASTCALL
85 KfReleaseSpinLock (
86         PKSPIN_LOCK     SpinLock,
87         KIRQL           NewIrql
88         )
89 /*
90  * FUNCTION: Releases a spinlock
91  * ARGUMENTS:
92  *        SpinLock = Spinlock to release
93  *        NewIrql = Irql level before acquiring the spinlock
94  */
95 {
96    KeReleaseSpinLockFromDpcLevel(SpinLock);
97    KeLowerIrql(NewIrql);
98 }
99
100 /* EOF */