2 * PROJECT: ReactOS Kernel
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: ntoskrnl/ex/fastinterlck.c
5 * PURPOSE: Portable Ex*Interlocked and REGISTER routines for amd64
6 * PROGRAMMERS: ReactOS Portable Systems Group
10 /* INCLUDES *******************************************************************/
16 #undef ExInterlockedAddLargeInteger
17 #undef ExInterlockedAddUlong
18 #undef ExInterlockedExtendZone
19 #undef ExInterlockedInsertHeadList
20 #undef ExInterlockedInsertTailList
21 #undef ExInterlockedPopEntryList
22 #undef ExInterlockedPushEntryList
23 #undef ExInterlockedRemoveHeadList
24 #undef ExpInterlockedFlushSList
25 #undef ExpInterlockedPopEntrySList
26 #undef ExpInterlockedPushEntrySList
28 /* FUNCTIONS ******************************************************************/
31 ExInterlockedAddLargeInteger(IN PLARGE_INTEGER Addend
,
32 IN LARGE_INTEGER Increment
,
36 Int
.QuadPart
= _InterlockedExchangeAdd64(&Addend
->QuadPart
,
42 ExInterlockedAddUlong(IN PULONG Addend
,
46 return (ULONG
)_InterlockedExchangeAdd((PLONG
)Addend
, Increment
);
50 ExInterlockedInsertHeadList(IN PLIST_ENTRY ListHead
,
51 IN PLIST_ENTRY ListEntry
,
55 PLIST_ENTRY OldHead
= NULL
;
56 KeAcquireSpinLock(Lock
, &OldIrql
);
57 if (!IsListEmpty(ListHead
)) OldHead
= ListEntry
->Flink
;
58 InsertHeadList(ListHead
, ListEntry
);
59 KeReleaseSpinLock(Lock
, OldIrql
);
64 ExInterlockedInsertTailList(IN PLIST_ENTRY ListHead
,
65 IN PLIST_ENTRY ListEntry
,
69 PLIST_ENTRY OldHead
= NULL
;
70 KeAcquireSpinLock(Lock
, &OldIrql
);
71 if (!IsListEmpty(ListHead
)) OldHead
= ListEntry
->Blink
;
72 InsertTailList(ListHead
, ListEntry
);
73 KeReleaseSpinLock(Lock
, OldIrql
);
78 ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead
,
82 PSINGLE_LIST_ENTRY FirstEntry
;
83 KeAcquireSpinLock(Lock
, &OldIrql
);
84 FirstEntry
= PopEntryList(ListHead
);
85 KeReleaseSpinLock(Lock
, OldIrql
);
90 ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead
,
91 IN PSINGLE_LIST_ENTRY ListEntry
,
95 PSINGLE_LIST_ENTRY OldHead
= NULL
;
96 KeAcquireSpinLock(Lock
, &OldIrql
);
97 OldHead
= ListHead
->Next
;
98 PushEntryList(ListHead
, ListEntry
);
99 KeReleaseSpinLock(Lock
, OldIrql
);
104 ExInterlockedRemoveHeadList(IN PLIST_ENTRY ListHead
,
108 PLIST_ENTRY OldHead
= NULL
;
109 KeAcquireSpinLock(Lock
, &OldIrql
);
110 if (!IsListEmpty(ListHead
)) OldHead
= RemoveHeadList(ListHead
);
111 KeReleaseSpinLock(Lock
, OldIrql
);