3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ex/interlck.c
6 * PURPOSE: Implements interlocked functions
7 * PROGRAMMER: David Welch (welch@mcmail.com)
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
17 /* FUNCTIONS *****************************************************************/
19 #ifdef ExInterlockedDecrementLong
20 #undef ExInterlockedDecrementLong
26 INTERLOCKED_RESULT STDCALL
27 ExInterlockedDecrementLong (PLONG Addend,
30 * Obsolete, use InterlockedDecrement instead
36 KeAcquireSpinLock (Lock, &oldlvl);
41 KeReleaseSpinLock (Lock, oldlvl);
47 #ifdef ExInterlockedExchangeUlong
48 #undef ExInterlockedExchangeUlong
55 ExInterlockedExchangeUlong (PULONG Target,
59 * Obsolete, use InterlockedExchange instead
65 KeAcquireSpinLock (Lock, &oldlvl);
70 KeReleaseSpinLock (Lock, oldlvl);
76 #ifdef ExInterlockedAddUlong
77 #undef ExInterlockedAddUlong
84 ExInterlockedAddUlong (PULONG Addend,
88 * ExInterlockedAddUlong adds an unsigned long value to a given unsigned
89 * integer as an atomic operation.
91 * ADDEND = Points to an unsigned long integer whose value is to be adjusted
92 * by the Increment value.
94 * INCREMENT = Is an unsigned long integer to be added.
96 * LOCK = Points to a spinlock to be used to synchronize access to ADDEND.
100 * The original value of the unsigned integer pointed to by ADDEND.
106 KeAcquireSpinLock (Lock, &oldlvl);
109 *Addend += Increment;
111 KeReleaseSpinLock (Lock, oldlvl);
119 LARGE_INTEGER STDCALL
120 ExInterlockedAddLargeInteger (PLARGE_INTEGER Addend,
121 LARGE_INTEGER Increment,
124 * Adds two large integer values as an atomic operation.
126 * ADDEND = Pointer to a large integer value that will have INCREMENT added.
128 * INCREMENT = Value to be added.
130 * LOCK = Spinlock used to synchronize access to ADDEND.
134 * The original value of the large integer pointed to by ADDEND.
138 LARGE_INTEGER oldval;
141 KeAcquireSpinLock (Lock, &oldlvl);
144 oldval.QuadPart = Addend->QuadPart;
145 Addend->QuadPart += Increment.QuadPart;
147 KeReleaseSpinLock (Lock, oldlvl);
152 #ifdef ExInterlockedIncrementLong
153 #undef ExInterlockedIncrementLong
159 INTERLOCKED_RESULT STDCALL
160 ExInterlockedIncrementLong (PLONG Addend,
163 * Obsolete, use InterlockedIncrement instead.
169 KeAcquireSpinLock (Lock, &oldlvl);
174 KeReleaseSpinLock (Lock, oldlvl);
183 ExInterlockedAddLargeStatistic (IN PLARGE_INTEGER Addend,
186 * Undocumented in DDK.
189 Addend->QuadPart += Increment;
196 ExInterlockedCompareExchange64 (IN OUT PLONGLONG Destination,
197 IN PLONGLONG Exchange,
198 IN PLONGLONG Comparand,
201 * Undocumented in DDK.
207 KeAcquireSpinLock (Lock, &oldlvl);
209 oldval = *Destination;
210 if (*Destination == *Comparand)
212 *Destination = *Exchange;
215 KeReleaseSpinLock (Lock, oldlvl);
224 ExfInterlockedAddUlong(PULONG Addend,
228 * ExInterlockedAddUlong adds an unsigned long value to a given unsigned
229 * integer as an atomic operation.
231 * ADDEND = Points to an unsigned long integer whose value is to be adjusted
232 * by the Increment value.
234 * INCREMENT = Is an unsigned long integer to be added.
236 * LOCK = Points to a spinlock to be used to synchronize access to ADDEND.
240 * The original value of the unsigned integer pointed to by ADDEND.
246 KeAcquireSpinLock (Lock, &oldlvl);
249 *Addend += Increment;
251 KeReleaseSpinLock (Lock, oldlvl);