update for HEAD-2003091401
[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 KIRQL FASTCALL
43 KeAcquireSpinLockRaiseToSynch (
44         PKSPIN_LOCK     SpinLock
45         )
46 {
47   ASSERT_IRQL(SYNCH_LEVEL);
48   KeAcquireSpinLockAtDpcLevel(SpinLock);
49 }
50
51 VOID STDCALL
52 KeReleaseSpinLock (
53         PKSPIN_LOCK     SpinLock,
54         KIRQL           NewIrql
55         )
56 /*
57  * FUNCTION: Releases a spinlock
58  * ARGUMENTS:
59  *        SpinLock = Spinlock to release
60  *        NewIrql = Irql level before acquiring the spinlock
61  */
62 {
63    KeReleaseSpinLockFromDpcLevel(SpinLock);
64    KeLowerIrql(NewIrql);
65 }
66
67 KIRQL FASTCALL
68 KfAcquireSpinLock (
69         PKSPIN_LOCK     SpinLock
70         )
71 {
72    KIRQL OldIrql;
73
74    KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
75    KeAcquireSpinLockAtDpcLevel(SpinLock);
76
77    return OldIrql;
78 }
79
80 VOID FASTCALL
81 KfReleaseSpinLock (
82         PKSPIN_LOCK     SpinLock,
83         KIRQL           NewIrql
84         )
85 /*
86  * FUNCTION: Releases a spinlock
87  * ARGUMENTS:
88  *        SpinLock = Spinlock to release
89  *        NewIrql = Irql level before acquiring the spinlock
90  */
91 {
92    KeReleaseSpinLockFromDpcLevel(SpinLock);
93    KeLowerIrql(NewIrql);
94 }
95
96 /* EOF */