- DBGKD_WAIT_STATE_CHANGE64 is used in KD protocol 5, not number 6 that we use. Proto...
[reactos.git] / reactos / lib / rtl / powerpc / interlocked.c
1 typedef unsigned int size_t;
2 #include <ntddk.h>
3 #include <winddk.h>
4 #include <string.h>
5 #include <intrin.h>
6
7 NTKERNELAPI
8 LONG
9 FASTCALL
10 InterlockedExchange(
11 LONG volatile *Target, LONG Value)
12 {
13 return _InterlockedExchange(Target, Value);
14 }
15
16 NTKERNELAPI
17 LONG
18 FASTCALL
19 InterlockedExchangeAdd(
20 LONG volatile *Target, LONG Value)
21 {
22 return _InterlockedExchangeAdd(Target, Value);
23 }
24
25 NTKERNELAPI
26 LONG
27 WINAPI
28 InterlockedCompareExchange(
29 LONG volatile *Destination,
30 LONG Exchange, LONG Comparand)
31 {
32 return _InterlockedCompareExchange(Destination, Exchange, Comparand);
33 }
34
35 NTKERNELAPI
36 LONG
37 FASTCALL
38 InterlockedIncrement
39 (IN OUT LONG volatile *Addend)
40 {
41 return _InterlockedIncrement(Addend);
42 }
43
44 NTKERNELAPI
45 LONG
46 FASTCALL
47 InterlockedDecrement(
48 IN OUT LONG volatile *Addend)
49 {
50 return _InterlockedDecrement(Addend);
51 }
52
53 PSLIST_ENTRY
54 WINAPI
55 InterlockedPopEntrySList(
56 PSLIST_HEADER ListHead)
57 {
58 PSLIST_ENTRY Result = NULL;
59 KIRQL OldIrql;
60 static BOOLEAN GLLInit = FALSE;
61 static KSPIN_LOCK GlobalListLock;
62
63 if(!GLLInit)
64 {
65 KeInitializeSpinLock(&GlobalListLock);
66 GLLInit = TRUE;
67 }
68
69 KeAcquireSpinLock(&GlobalListLock, &OldIrql);
70 if(ListHead->Next.Next)
71 {
72 Result = ListHead->Next.Next;
73 ListHead->Next.Next = Result->Next;
74 }
75 KeReleaseSpinLock(&GlobalListLock, OldIrql);
76 return Result;
77 }
78
79 NTKERNELAPI
80 PSLIST_ENTRY
81 FASTCALL
82 InterlockedPushEntrySList(
83 IN PSLIST_HEADER ListHead,
84 IN PSLIST_ENTRY ListEntry)
85 {
86 PVOID PrevValue;
87
88 do
89 {
90 PrevValue = ListHead->Next.Next;
91 ListEntry->Next = PrevValue;
92 }
93 while (InterlockedCompareExchangePointer(&ListHead->Next.Next,
94 ListEntry,
95 PrevValue) != PrevValue);
96
97 return (PSLIST_ENTRY)PrevValue;
98 }
99
100 NTKERNELAPI
101 VOID
102 FASTCALL
103 ExInterlockedAddLargeStatistic(
104 IN PLARGE_INTEGER Addend,
105 IN ULONG Increment)
106 {
107 _InterlockedAddLargeStatistic(&Addend->QuadPart, Increment);
108 }
109
110 NTKERNELAPI
111 LONGLONG
112 FASTCALL
113 ExInterlockedCompareExchange64(
114 IN OUT PLONGLONG Destination,
115 IN PLONGLONG Exchange,
116 IN PLONGLONG Comparand,
117 IN PKSPIN_LOCK Lock)
118 {
119 KIRQL OldIrql;
120 LONGLONG Result;
121
122 KeAcquireSpinLock(Lock, &OldIrql);
123 Result = *Destination;
124 if(*Destination == Result)
125 *Destination = *Exchange;
126 KeReleaseSpinLock(Lock, OldIrql);
127 return Result;
128 }