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