FreeRDP
Loading...
Searching...
No Matches
interlocked.h
1
20#ifndef WINPR_INTERLOCKED_H
21#define WINPR_INTERLOCKED_H
22
23#include <winpr/spec.h>
24#include <winpr/platform.h>
25#include <winpr/winpr.h>
26#include <winpr/wtypes.h>
27
28#ifdef __cplusplus
29extern "C"
30{
31#endif
32
33#ifndef _WIN32
34
35#ifndef CONTAINING_RECORD
36#define CONTAINING_RECORD(address, type, field) \
37 ((type*)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type*)0)->field))))
38#endif
39
40 typedef struct S_WINPR_LIST_ENTRY WINPR_LIST_ENTRY;
41 typedef struct S_WINPR_LIST_ENTRY* WINPR_PLIST_ENTRY;
42
44 {
45 WINPR_PLIST_ENTRY Flink;
46 WINPR_PLIST_ENTRY Blink;
47 };
48
49 typedef struct S_WINPR_SINGLE_LIST_ENTRY WINPR_SINGLE_LIST_ENTRY;
50 typedef struct S_WINPR_SINGLE_LIST_ENTRY* WINPR_PSINGLE_LIST_ENTRY;
51
53 {
54 WINPR_PSINGLE_LIST_ENTRY Next;
55 };
56
57 typedef struct WINPR_LIST_ENTRY32
58 {
59 DWORD Flink;
60 DWORD Blink;
63
64 typedef struct WINPR_LIST_ENTRY64
65 {
66 ULONGLONG Flink;
67 ULONGLONG Blink;
70
71#ifdef _WIN64
72
73 typedef struct S_WINPR_SLIST_ENTRY* WINPR_PSLIST_ENTRY;
74 typedef struct DECLSPEC_ALIGN(16) S_WINPR_SLIST_ENTRY
75 {
76 WINPR_PSLIST_ENTRY Next;
77 } WINPR_SLIST_ENTRY;
78
79#else /* _WIN64 */
80
81 WINPR_PRAGMA_DIAG_PUSH
82 WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
83
84#define WINPR_SLIST_ENTRY WINPR_SINGLE_LIST_ENTRY
85#define _WINPR_SLIST_ENTRY _WINPR_SINGLE_LIST_ENTRY
86#define WINPR_PSLIST_ENTRY WINPR_PSINGLE_LIST_ENTRY
87
88 WINPR_PRAGMA_DIAG_POP
89
90#endif /* _WIN64 */
91
92#ifdef _WIN64
93
94 typedef union DECLSPEC_ALIGN(16)
95 {
96 struct
97 {
98 ULONGLONG Alignment;
99 ULONGLONG Region;
100 } DUMMYSTRUCTNAME;
101
102 struct
103 {
104 ULONGLONG Depth : 16;
105 ULONGLONG Sequence : 9;
106 ULONGLONG NextEntry : 39;
107 ULONGLONG HeaderType : 1;
108 ULONGLONG Init : 1;
109 ULONGLONG Reserved : 59;
110 ULONGLONG Region : 3;
111 } Header8;
112
113 struct
114 {
115 ULONGLONG Depth : 16;
116 ULONGLONG Sequence : 48;
117 ULONGLONG HeaderType : 1;
118 ULONGLONG Reserved : 3;
119 ULONGLONG NextEntry : 60;
120 } HeaderX64;
122
123#else /* _WIN64 */
124
125 typedef union
126 {
127 ULONGLONG Alignment;
128
129 struct
130 {
131 WINPR_SLIST_ENTRY Next;
132 WORD Depth;
133 WORD Sequence;
134 } DUMMYSTRUCTNAME;
136
137#endif /* _WIN64 */
138
139 /* Singly-Linked List */
140
141 WINPR_API VOID InitializeSListHead(WINPR_PSLIST_HEADER ListHead);
142
143 WINPR_API WINPR_PSLIST_ENTRY InterlockedPushEntrySList(WINPR_PSLIST_HEADER ListHead,
144 WINPR_PSLIST_ENTRY ListEntry);
145 WINPR_API WINPR_PSLIST_ENTRY InterlockedPushListSListEx(WINPR_PSLIST_HEADER ListHead,
146 WINPR_PSLIST_ENTRY List,
147 WINPR_PSLIST_ENTRY ListEnd,
148 ULONG Count);
149 WINPR_API WINPR_PSLIST_ENTRY InterlockedPopEntrySList(WINPR_PSLIST_HEADER ListHead);
150 WINPR_API WINPR_PSLIST_ENTRY InterlockedFlushSList(WINPR_PSLIST_HEADER ListHead);
151
152 WINPR_API USHORT QueryDepthSList(WINPR_PSLIST_HEADER ListHead);
153
154 WINPR_API LONG InterlockedIncrement(LONG volatile* Addend);
155 WINPR_API LONG InterlockedDecrement(LONG volatile* Addend);
156
157 WINPR_API LONG InterlockedExchange(LONG volatile* Target, LONG Value);
158 WINPR_API LONG InterlockedExchangeAdd(LONG volatile* Addend, LONG Value);
159
160 WINPR_API LONG InterlockedCompareExchange(LONG volatile* Destination, LONG Exchange,
161 LONG Comperand);
162
163 WINPR_API PVOID InterlockedCompareExchangePointer(PVOID volatile* Destination, PVOID Exchange,
164 PVOID Comperand);
165
166#else /* _WIN32 */
167#define WINPR_LIST_ENTRY LIST_ENTRY
168#define WINPR_PLIST_ENTRY PLIST_ENTRY
169
170#define WINPR_SINGLE_LIST_ENTRY SINGLE_LIST_ENTRY
171#define WINPR_PSINGLE_LIST_ENTRY PSINGLE_LIST_ENTRY
172
173#define WINPR_SLIST_ENTRY SLIST_ENTRY
174#define WINPR_PSLIST_ENTRY PSLIST_ENTRY
175
176#define WINPR_SLIST_HEADER SLIST_HEADER
177#define WINPR_PSLIST_HEADER PSLIST_HEADER
178
179#endif /* _WIN32 */
180
181#if (!defined(_WIN32) || \
182 (defined(_WIN32) && (_WIN32_WINNT < 0x0502) && !defined(InterlockedCompareExchange64)))
183#define WINPR_INTERLOCKED_COMPARE_EXCHANGE64 1
184#endif
185
186#ifdef WINPR_INTERLOCKED_COMPARE_EXCHANGE64
187
188 WINPR_API LONGLONG InterlockedCompareExchange64(LONGLONG volatile* Destination,
189 LONGLONG Exchange, LONGLONG Comperand);
190
191#endif
192
193 /* Doubly-Linked List */
194
195 WINPR_API VOID InitializeListHead(WINPR_PLIST_ENTRY ListHead);
196
197 WINPR_API BOOL IsListEmpty(const WINPR_LIST_ENTRY* ListHead);
198
199 WINPR_API BOOL RemoveEntryList(WINPR_PLIST_ENTRY Entry);
200
201 WINPR_API VOID InsertHeadList(WINPR_PLIST_ENTRY ListHead, WINPR_PLIST_ENTRY Entry);
202 WINPR_API WINPR_PLIST_ENTRY RemoveHeadList(WINPR_PLIST_ENTRY ListHead);
203
204 WINPR_API VOID InsertTailList(WINPR_PLIST_ENTRY ListHead, WINPR_PLIST_ENTRY Entry);
205 WINPR_API WINPR_PLIST_ENTRY RemoveTailList(WINPR_PLIST_ENTRY ListHead);
206 WINPR_API VOID AppendTailList(WINPR_PLIST_ENTRY ListHead, WINPR_PLIST_ENTRY ListToAppend);
207
208 WINPR_API VOID PushEntryList(WINPR_PSINGLE_LIST_ENTRY ListHead, WINPR_PSINGLE_LIST_ENTRY Entry);
209 WINPR_API WINPR_PSINGLE_LIST_ENTRY PopEntryList(WINPR_PSINGLE_LIST_ENTRY ListHead);
210
211#ifdef __cplusplus
212}
213#endif
214
215#endif /* WINPR_INTERLOCKED_H */
Definition interlocked.h:44
Definition interlocked.h:53