20#ifndef WINPR_INTERLOCKED_H
21#define WINPR_INTERLOCKED_H
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>
36#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
38#ifndef CONTAINING_RECORD
39#define CONTAINING_RECORD(address, type, field) \
40 ((type*)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type*)0)->field))))
43 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
typedef struct S_WINPR_LIST_ENTRY WINPR_LIST_ENTRY);
49 WINPR_PLIST_ENTRY Flink;
50 WINPR_PLIST_ENTRY Blink;
53 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
60 WINPR_PSINGLE_LIST_ENTRY Next;
64 "[since 3.27.0]",
typedef struct WINPR_LIST_ENTRY32 {
67 } WINPR_LIST_ENTRY32);
69 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
typedef WINPR_LIST_ENTRY32* WINPR_PLIST_ENTRY32);
72 "[since 3.27.0]",
typedef struct WINPR_LIST_ENTRY64 {
75 } WINPR_LIST_ENTRY64);
77 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
typedef WINPR_LIST_ENTRY64* WINPR_PLIST_ENTRY64);
81 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
typedef struct S_WINPR_SLIST_ENTRY* WINPR_PSLIST_ENTRY);
84 "[since 3.27.0]",
typedef struct DECLSPEC_ALIGN(16)
85 S_WINPR_SLIST_ENTRY { WINPR_PSLIST_ENTRY Next; } WINPR_SLIST_ENTRY);
89 WINPR_PRAGMA_DIAG_PUSH
90 WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
92#define WINPR_SLIST_ENTRY WINPR_SINGLE_LIST_ENTRY
94#define _WINPR_SLIST_ENTRY _WINPR_SINGLE_LIST_ENTRY
95#define WINPR_PSLIST_ENTRY WINPR_PSINGLE_LIST_ENTRY
102 WINPR_DEPRECATED_VAR(
104 typedef union DECLSPEC_ALIGN(16) {
113 ULONGLONG Depth : 16;
114 ULONGLONG Sequence : 9;
115 ULONGLONG NextEntry : 39;
116 ULONGLONG HeaderType : 1;
118 ULONGLONG Reserved : 59;
119 ULONGLONG Region : 3;
124 ULONGLONG Depth : 16;
125 ULONGLONG Sequence : 48;
126 ULONGLONG HeaderType : 1;
127 ULONGLONG Reserved : 3;
128 ULONGLONG NextEntry : 60;
130 } WINPR_SLIST_HEADER),
131 *WINPR_PSLIST_HEADER;
135 WINPR_DEPRECATED_VAR(
142 WINPR_SLIST_ENTRY Next;
146 } WINPR_SLIST_HEADER),
147 *WINPR_PSLIST_HEADER;
152 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
153 WINPR_API VOID InitializeSListHead(WINPR_PSLIST_HEADER ListHead));
155 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
156 WINPR_API WINPR_PSLIST_ENTRY InterlockedPushEntrySList(
157 WINPR_PSLIST_HEADER ListHead, WINPR_PSLIST_ENTRY ListEntry));
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));
164 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
165 WINPR_ATTR_NODISCARD WINPR_API WINPR_PSLIST_ENTRY
166 InterlockedPopEntrySList(WINPR_PSLIST_HEADER ListHead));
168 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API WINPR_PSLIST_ENTRY
169 InterlockedFlushSList(WINPR_PSLIST_HEADER ListHead));
171 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API USHORT
172 QueryDepthSList(WINPR_PSLIST_HEADER ListHead));
175 WINPR_API LONG InterlockedIncrement(LONG
volatile* Addend);
177 WINPR_API LONG InterlockedDecrement(LONG
volatile* Addend);
180 WINPR_API LONG InterlockedExchange(LONG
volatile* Target, LONG Value);
183 WINPR_API LONG InterlockedExchangeAdd(LONG
volatile* Addend, LONG Value);
186 WINPR_API LONG InterlockedCompareExchange(LONG
volatile* Destination, LONG Exchange,
190 WINPR_API PVOID InterlockedCompareExchangePointer(PVOID
volatile* Destination, PVOID Exchange,
194#define WINPR_LIST_ENTRY LIST_ENTRY
195#define WINPR_PLIST_ENTRY PLIST_ENTRY
197#define WINPR_SINGLE_LIST_ENTRY SINGLE_LIST_ENTRY
198#define WINPR_PSINGLE_LIST_ENTRY PSINGLE_LIST_ENTRY
200#define WINPR_SLIST_ENTRY SLIST_ENTRY
201#define WINPR_PSLIST_ENTRY PSLIST_ENTRY
203#define WINPR_SLIST_HEADER SLIST_HEADER
204#define WINPR_PSLIST_HEADER PSLIST_HEADER
208#if (!defined(_WIN32) || \
209 (defined(_WIN32) && (_WIN32_WINNT < 0x0502) && !defined(InterlockedCompareExchange64)))
210#define WINPR_INTERLOCKED_COMPARE_EXCHANGE64 1
213#ifdef WINPR_INTERLOCKED_COMPARE_EXCHANGE64
216 WINPR_API LONGLONG InterlockedCompareExchange64(LONGLONG
volatile* Destination,
217 LONGLONG Exchange, LONGLONG Comperand);
221#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
223 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
224 WINPR_API VOID InitializeListHead(WINPR_PLIST_ENTRY ListHead));
226 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API BOOL
227 IsListEmpty(
const WINPR_LIST_ENTRY* ListHead));
229 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API BOOL
230 RemoveEntryList(WINPR_PLIST_ENTRY Entry));
232 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_API VOID InsertHeadList(WINPR_PLIST_ENTRY ListHead,
233 WINPR_PLIST_ENTRY Entry));
235 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API WINPR_PLIST_ENTRY
236 RemoveHeadList(WINPR_PLIST_ENTRY ListHead));
238 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_API VOID InsertTailList(WINPR_PLIST_ENTRY ListHead,
239 WINPR_PLIST_ENTRY Entry));
241 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API WINPR_PLIST_ENTRY
242 RemoveTailList(WINPR_PLIST_ENTRY ListHead));
244 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
245 WINPR_API VOID AppendTailList(WINPR_PLIST_ENTRY ListHead,
246 WINPR_PLIST_ENTRY ListToAppend));
248 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
249 WINPR_API VOID PushEntryList(WINPR_PSINGLE_LIST_ENTRY ListHead,
250 WINPR_PSINGLE_LIST_ENTRY Entry));
252 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API WINPR_PSINGLE_LIST_ENTRY
253 PopEntryList(WINPR_PSINGLE_LIST_ENTRY ListHead));