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]", typedef union DECLSPEC_ALIGN(16) {
104 struct
105 {
106 ULONGLONG Alignment;
107 ULONGLONG Region;
108 } DUMMYSTRUCTNAME;
109
110 struct
111 {
112 ULONGLONG Depth : 16;
113 ULONGLONG Sequence : 9;
114 ULONGLONG NextEntry : 39;
115 ULONGLONG HeaderType : 1;
116 ULONGLONG Init : 1;
117 ULONGLONG Reserved : 59;
118 ULONGLONG Region : 3;
119 } Header8;
120
121 struct
122 {
123 ULONGLONG Depth : 16;
124 ULONGLONG Sequence : 48;
125 ULONGLONG HeaderType : 1;
126 ULONGLONG Reserved : 3;
127 ULONGLONG NextEntry : 60;
128 } HeaderX64;
129 } WINPR_SLIST_HEADER);
130
131#else /* _WIN64 */
132
133 WINPR_DEPRECATED_VAR(
134 "[since 3.27.0]", typedef union {
135 ULONGLONG Alignment;
136
137 struct
138 {
139 WINPR_SLIST_ENTRY Next;
140 WORD Depth;
141 WORD Sequence;
142 } DUMMYSTRUCTNAME;
143 } WINPR_SLIST_HEADER);
144#endif /* _WIN64 */
145
146 typedef WINPR_SLIST_HEADER* WINPR_PSLIST_HEADER;
147
148 /* Singly-Linked List */
149
150 WINPR_DEPRECATED_VAR("[since 3.27.0]",
151 WINPR_API VOID InitializeSListHead(WINPR_PSLIST_HEADER ListHead));
152
153 WINPR_DEPRECATED_VAR("[since 3.27.0]",
154 WINPR_API WINPR_PSLIST_ENTRY InterlockedPushEntrySList(
155 WINPR_PSLIST_HEADER ListHead, WINPR_PSLIST_ENTRY ListEntry));
156
157 WINPR_DEPRECATED_VAR("[since 3.27.0]",
158 WINPR_API WINPR_PSLIST_ENTRY InterlockedPushListSListEx(
159 WINPR_PSLIST_HEADER ListHead, WINPR_PSLIST_ENTRY List,
160 WINPR_PSLIST_ENTRY ListEnd, ULONG Count));
161
162 WINPR_DEPRECATED_VAR("[since 3.27.0]",
163 WINPR_ATTR_NODISCARD WINPR_API WINPR_PSLIST_ENTRY
164 InterlockedPopEntrySList(WINPR_PSLIST_HEADER ListHead));
165
166 WINPR_DEPRECATED_VAR("[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API WINPR_PSLIST_ENTRY
167 InterlockedFlushSList(WINPR_PSLIST_HEADER ListHead));
168
169 WINPR_DEPRECATED_VAR("[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API USHORT
170 QueryDepthSList(WINPR_PSLIST_HEADER ListHead));
171#endif /* WITHOUT_WINPR_3x_DEPRECATED */
172
173 WINPR_API LONG InterlockedIncrement(LONG volatile* Addend);
174
175 WINPR_API LONG InterlockedDecrement(LONG volatile* Addend);
176
177 WINPR_ATTR_NODISCARD
178 WINPR_API LONG InterlockedExchange(LONG volatile* Target, LONG Value);
179
180 WINPR_ATTR_NODISCARD
181 WINPR_API LONG InterlockedExchangeAdd(LONG volatile* Addend, LONG Value);
182
183 WINPR_ATTR_NODISCARD
184 WINPR_API LONG InterlockedCompareExchange(LONG volatile* Destination, LONG Exchange,
185 LONG Comperand);
186
187 WINPR_ATTR_NODISCARD
188 WINPR_API PVOID InterlockedCompareExchangePointer(PVOID volatile* Destination, PVOID Exchange,
189 PVOID Comperand);
190
191#else /* _WIN32 */
192#define WINPR_LIST_ENTRY LIST_ENTRY
193#define WINPR_PLIST_ENTRY PLIST_ENTRY
194
195#define WINPR_SINGLE_LIST_ENTRY SINGLE_LIST_ENTRY
196#define WINPR_PSINGLE_LIST_ENTRY PSINGLE_LIST_ENTRY
197
198#define WINPR_SLIST_ENTRY SLIST_ENTRY
199#define WINPR_PSLIST_ENTRY PSLIST_ENTRY
200
201#define WINPR_SLIST_HEADER SLIST_HEADER
202#define WINPR_PSLIST_HEADER PSLIST_HEADER
203
204#endif /* _WIN32 */
205
206#if (!defined(_WIN32) || \
207 (defined(_WIN32) && (_WIN32_WINNT < 0x0502) && !defined(InterlockedCompareExchange64)))
208#define WINPR_INTERLOCKED_COMPARE_EXCHANGE64 1
209#endif
210
211#ifdef WINPR_INTERLOCKED_COMPARE_EXCHANGE64
212
213 WINPR_ATTR_NODISCARD
214 WINPR_API LONGLONG InterlockedCompareExchange64(LONGLONG volatile* Destination,
215 LONGLONG Exchange, LONGLONG Comperand);
216
217#endif
218
219#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
220 /* Doubly-Linked List */
221 WINPR_DEPRECATED_VAR("[since 3.27.0]",
222 WINPR_API VOID InitializeListHead(WINPR_PLIST_ENTRY ListHead));
223
224 WINPR_DEPRECATED_VAR("[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API BOOL
225 IsListEmpty(const WINPR_LIST_ENTRY* ListHead));
226
227 WINPR_DEPRECATED_VAR("[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API BOOL
228 RemoveEntryList(WINPR_PLIST_ENTRY Entry));
229
230 WINPR_DEPRECATED_VAR("[since 3.27.0]", WINPR_API VOID InsertHeadList(WINPR_PLIST_ENTRY ListHead,
231 WINPR_PLIST_ENTRY Entry));
232
233 WINPR_DEPRECATED_VAR("[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API WINPR_PLIST_ENTRY
234 RemoveHeadList(WINPR_PLIST_ENTRY ListHead));
235
236 WINPR_DEPRECATED_VAR("[since 3.27.0]", WINPR_API VOID InsertTailList(WINPR_PLIST_ENTRY ListHead,
237 WINPR_PLIST_ENTRY Entry));
238
239 WINPR_DEPRECATED_VAR("[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API WINPR_PLIST_ENTRY
240 RemoveTailList(WINPR_PLIST_ENTRY ListHead));
241
242 WINPR_DEPRECATED_VAR("[since 3.27.0]",
243 WINPR_API VOID AppendTailList(WINPR_PLIST_ENTRY ListHead,
244 WINPR_PLIST_ENTRY ListToAppend));
245
246 WINPR_DEPRECATED_VAR("[since 3.27.0]",
247 WINPR_API VOID PushEntryList(WINPR_PSINGLE_LIST_ENTRY ListHead,
248 WINPR_PSINGLE_LIST_ENTRY Entry));
249
250 WINPR_DEPRECATED_VAR("[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API WINPR_PSINGLE_LIST_ENTRY
251 PopEntryList(WINPR_PSINGLE_LIST_ENTRY ListHead));
252#endif /* WITHOUT_WINPR_3x_DEPRECATED */
253
254#ifdef __cplusplus
255}
256#endif
257
258#endif /* WINPR_INTERLOCKED_H */
Definition interlocked.h:48
Definition interlocked.h:59