20#ifndef WINPR_INTERLOCKED_H
21#define WINPR_INTERLOCKED_H
23#include <winpr/spec.h>
24#include <winpr/platform.h>
25#include <winpr/winpr.h>
26#include <winpr/wtypes.h>
35#ifndef CONTAINING_RECORD
36#define CONTAINING_RECORD(address, type, field) \
37 ((type*)(((ULONG_PTR)address) - (ULONG_PTR)(&(((type*)0)->field))))
45 WINPR_PLIST_ENTRY Flink;
46 WINPR_PLIST_ENTRY Blink;
54 WINPR_PSINGLE_LIST_ENTRY Next;
73 typedef struct S_WINPR_SLIST_ENTRY* WINPR_PSLIST_ENTRY;
74 typedef struct DECLSPEC_ALIGN(16) S_WINPR_SLIST_ENTRY
76 WINPR_PSLIST_ENTRY Next;
81 WINPR_PRAGMA_DIAG_PUSH
82 WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
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
94 typedef union DECLSPEC_ALIGN(16)
104 ULONGLONG Depth : 16;
105 ULONGLONG Sequence : 9;
106 ULONGLONG NextEntry : 39;
107 ULONGLONG HeaderType : 1;
109 ULONGLONG Reserved : 59;
110 ULONGLONG Region : 3;
115 ULONGLONG Depth : 16;
116 ULONGLONG Sequence : 48;
117 ULONGLONG HeaderType : 1;
118 ULONGLONG Reserved : 3;
119 ULONGLONG NextEntry : 60;
131 WINPR_SLIST_ENTRY Next;
144 WINPR_PSLIST_ENTRY ListEntry);
146 WINPR_PSLIST_ENTRY List,
147 WINPR_PSLIST_ENTRY ListEnd,
154 WINPR_API LONG InterlockedIncrement(LONG
volatile* Addend);
155 WINPR_API LONG InterlockedDecrement(LONG
volatile* Addend);
157 WINPR_API LONG InterlockedExchange(LONG
volatile* Target, LONG Value);
158 WINPR_API LONG InterlockedExchangeAdd(LONG
volatile* Addend, LONG Value);
160 WINPR_API LONG InterlockedCompareExchange(LONG
volatile* Destination, LONG Exchange,
163 WINPR_API PVOID InterlockedCompareExchangePointer(PVOID
volatile* Destination, PVOID Exchange,
167#define WINPR_LIST_ENTRY LIST_ENTRY
168#define WINPR_PLIST_ENTRY PLIST_ENTRY
170#define WINPR_SINGLE_LIST_ENTRY SINGLE_LIST_ENTRY
171#define WINPR_PSINGLE_LIST_ENTRY PSINGLE_LIST_ENTRY
173#define WINPR_SLIST_ENTRY SLIST_ENTRY
174#define WINPR_PSLIST_ENTRY PSLIST_ENTRY
176#define WINPR_SLIST_HEADER SLIST_HEADER
177#define WINPR_PSLIST_HEADER PSLIST_HEADER
181#if (!defined(_WIN32) || \
182 (defined(_WIN32) && (_WIN32_WINNT < 0x0502) && !defined(InterlockedCompareExchange64)))
183#define WINPR_INTERLOCKED_COMPARE_EXCHANGE64 1
186#ifdef WINPR_INTERLOCKED_COMPARE_EXCHANGE64
188 WINPR_API LONGLONG InterlockedCompareExchange64(LONGLONG
volatile* Destination,
189 LONGLONG Exchange, LONGLONG Comperand);
195 WINPR_API VOID InitializeListHead(WINPR_PLIST_ENTRY ListHead);
197 WINPR_API BOOL IsListEmpty(
const WINPR_LIST_ENTRY* ListHead);
199 WINPR_API BOOL RemoveEntryList(WINPR_PLIST_ENTRY Entry);
201 WINPR_API VOID InsertHeadList(WINPR_PLIST_ENTRY ListHead, WINPR_PLIST_ENTRY Entry);
202 WINPR_API WINPR_PLIST_ENTRY RemoveHeadList(WINPR_PLIST_ENTRY ListHead);
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);
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);