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(
103 "[since 3.27.0]",
typedef union DECLSPEC_ALIGN(16) {
112 ULONGLONG Depth : 16;
113 ULONGLONG Sequence : 9;
114 ULONGLONG NextEntry : 39;
115 ULONGLONG HeaderType : 1;
117 ULONGLONG Reserved : 59;
118 ULONGLONG Region : 3;
123 ULONGLONG Depth : 16;
124 ULONGLONG Sequence : 48;
125 ULONGLONG HeaderType : 1;
126 ULONGLONG Reserved : 3;
127 ULONGLONG NextEntry : 60;
129 } WINPR_SLIST_HEADER);
133 WINPR_DEPRECATED_VAR(
134 "[since 3.27.0]",
typedef union {
139 WINPR_SLIST_ENTRY Next;
143 } WINPR_SLIST_HEADER);
146 typedef WINPR_SLIST_HEADER* WINPR_PSLIST_HEADER;
150 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
151 WINPR_API VOID InitializeSListHead(WINPR_PSLIST_HEADER ListHead));
153 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
154 WINPR_API WINPR_PSLIST_ENTRY InterlockedPushEntrySList(
155 WINPR_PSLIST_HEADER ListHead, WINPR_PSLIST_ENTRY ListEntry));
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));
162 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
163 WINPR_ATTR_NODISCARD WINPR_API WINPR_PSLIST_ENTRY
164 InterlockedPopEntrySList(WINPR_PSLIST_HEADER ListHead));
166 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API WINPR_PSLIST_ENTRY
167 InterlockedFlushSList(WINPR_PSLIST_HEADER ListHead));
169 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API USHORT
170 QueryDepthSList(WINPR_PSLIST_HEADER ListHead));
173 WINPR_API LONG InterlockedIncrement(LONG
volatile* Addend);
175 WINPR_API LONG InterlockedDecrement(LONG
volatile* Addend);
178 WINPR_API LONG InterlockedExchange(LONG
volatile* Target, LONG Value);
181 WINPR_API LONG InterlockedExchangeAdd(LONG
volatile* Addend, LONG Value);
184 WINPR_API LONG InterlockedCompareExchange(LONG
volatile* Destination, LONG Exchange,
188 WINPR_API PVOID InterlockedCompareExchangePointer(PVOID
volatile* Destination, PVOID Exchange,
192#define WINPR_LIST_ENTRY LIST_ENTRY
193#define WINPR_PLIST_ENTRY PLIST_ENTRY
195#define WINPR_SINGLE_LIST_ENTRY SINGLE_LIST_ENTRY
196#define WINPR_PSINGLE_LIST_ENTRY PSINGLE_LIST_ENTRY
198#define WINPR_SLIST_ENTRY SLIST_ENTRY
199#define WINPR_PSLIST_ENTRY PSLIST_ENTRY
201#define WINPR_SLIST_HEADER SLIST_HEADER
202#define WINPR_PSLIST_HEADER PSLIST_HEADER
206#if (!defined(_WIN32) || \
207 (defined(_WIN32) && (_WIN32_WINNT < 0x0502) && !defined(InterlockedCompareExchange64)))
208#define WINPR_INTERLOCKED_COMPARE_EXCHANGE64 1
211#ifdef WINPR_INTERLOCKED_COMPARE_EXCHANGE64
214 WINPR_API LONGLONG InterlockedCompareExchange64(LONGLONG
volatile* Destination,
215 LONGLONG Exchange, LONGLONG Comperand);
219#if !defined(WITHOUT_WINPR_3x_DEPRECATED)
221 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
222 WINPR_API VOID InitializeListHead(WINPR_PLIST_ENTRY ListHead));
224 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API BOOL
225 IsListEmpty(
const WINPR_LIST_ENTRY* ListHead));
227 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API BOOL
228 RemoveEntryList(WINPR_PLIST_ENTRY Entry));
230 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_API VOID InsertHeadList(WINPR_PLIST_ENTRY ListHead,
231 WINPR_PLIST_ENTRY Entry));
233 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API WINPR_PLIST_ENTRY
234 RemoveHeadList(WINPR_PLIST_ENTRY ListHead));
236 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_API VOID InsertTailList(WINPR_PLIST_ENTRY ListHead,
237 WINPR_PLIST_ENTRY Entry));
239 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API WINPR_PLIST_ENTRY
240 RemoveTailList(WINPR_PLIST_ENTRY ListHead));
242 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
243 WINPR_API VOID AppendTailList(WINPR_PLIST_ENTRY ListHead,
244 WINPR_PLIST_ENTRY ListToAppend));
246 WINPR_DEPRECATED_VAR(
"[since 3.27.0]",
247 WINPR_API VOID PushEntryList(WINPR_PSINGLE_LIST_ENTRY ListHead,
248 WINPR_PSINGLE_LIST_ENTRY Entry));
250 WINPR_DEPRECATED_VAR(
"[since 3.27.0]", WINPR_ATTR_NODISCARD WINPR_API WINPR_PSINGLE_LIST_ENTRY
251 PopEntryList(WINPR_PSINGLE_LIST_ENTRY ListHead));