23 #define COND_VAR_UNUSED_FLAG ((ULONG_PTR)1) 24 #define COND_VAR_LOCKED_FLAG ((ULONG_PTR)2) 25 #define COND_VAR_FLAGS_MASK ((ULONG_PTR)3) 26 #define COND_VAR_ADDRESS_MASK (~COND_VAR_FLAGS_MASK) 37 #define CONTAINING_COND_VAR_WAIT_ENTRY(address, field) \ 38 CONTAINING_RECORD(address, COND_VAR_WAIT_ENTRY, field) 113 if ((AbortIfLocked !=
NULL) && *AbortIfLocked)
120 OldVal = *(
ULONG_PTR *)&ConditionVariable->Ptr;
127 if (InsertEntry ==
NULL)
130 if (OldListHead ==
NULL)
152 if (LockRes == OldVal)
156 if (InsertEntry ==
NULL)
166 if (OldListHead ==
NULL)
204 if (RemoveEntry !=
NULL)
207 if (&RemoveEntry->ListEntry == NewHeadEntry)
215 NewHeadEntry = NewHeadEntry->Flink;
236 RemoveEntry->ListRemovalHandled =
TRUE;
246 if (LockRes == OldVal)
273 if (HeadEntry ==
NULL)
281 RemoveOnUnlockEntry =
NULL;
292 if (HeadEntry ==
Entry)
321 if (HeadEntry ==
Entry)
326 RemoveOnUnlockEntry = HeadEntry;
479 ConditionVariable->Ptr =
NULL;
struct _LIST_ENTRY * PLIST_ENTRY
VOID NTAPI RtlWakeConditionVariable(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable)
NTSYSAPI NTSTATUS WINAPI NtWaitForKeyedEvent(HANDLE, const void *, BOOLEAN, const LARGE_INTEGER *)
static VOID InternalWake(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable, IN BOOLEAN ReleaseAll)
#define CONTAINING_COND_VAR_WAIT_ENTRY(address, field)
NTSTATUS NTAPI RtlSleepConditionVariableCS(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable, IN OUT PRTL_CRITICAL_SECTION CriticalSection, IN const LARGE_INTEGER *TimeOut OPTIONAL)
struct _COND_VAR_WAIT_ENTRY * PCOND_VAR_WAIT_ENTRY
struct _COND_VAR_WAIT_ENTRY COND_VAR_WAIT_ENTRY
VOID RtlpCloseKeyedEvent(VOID)
VOID RtlpInitializeKeyedEvent(VOID)
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
static NTSTATUS InternalSleep(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable, IN OUT PRTL_CRITICAL_SECTION CriticalSection OPTIONAL, IN OUT PRTL_SRWLOCK SRWLock OPTIONAL, IN ULONG SRWFlags, IN const LARGE_INTEGER *TimeOut OPTIONAL)
#define InsertTailList(ListHead, Entry)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
#define STATUS_INVALID_HANDLE
VOID NTAPI RtlAcquireSRWLockShared(IN OUT PRTL_SRWLOCK SRWLock)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
FORCEINLINE VOID YieldProcessor(VOID)
BOOLEAN ListRemovalHandled
VOID NTAPI RtlReleaseSRWLockShared(IN OUT PRTL_SRWLOCK SRWLock)
NTSYSAPI NTSTATUS WINAPI NtCreateKeyedEvent(HANDLE *, ACCESS_MASK, const OBJECT_ATTRIBUTES *, ULONG)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
CRITICAL_SECTION CriticalSection
NTSYSAPI NTSTATUS WINAPI NtReleaseKeyedEvent(HANDLE, const void *, BOOLEAN, const LARGE_INTEGER *)
VOID NTAPI RtlAcquireSRWLockExclusive(IN OUT PRTL_SRWLOCK SRWLock)
#define COND_VAR_LOCKED_FLAG
_Must_inspect_result_ _In_ ULONG Flags
#define NT_SUCCESS(StatCode)
static VOID InternalUnlockCondVar(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable, IN PCOND_VAR_WAIT_ENTRY RemoveEntry OPTIONAL)
#define COND_VAR_FLAGS_MASK
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define RTL_CONDITION_VARIABLE_LOCKMODE_SHARED
FORCEINLINE ULONG_PTR InternalCmpXChgCondVarAcq(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable, IN ULONG_PTR Exchange, IN ULONG_PTR Comperand)
FORCEINLINE ULONG_PTR InternalCmpXChgCondVarRel(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable, IN ULONG_PTR Exchange, IN ULONG_PTR Comperand)
#define COND_VAR_ADDRESS_MASK
static HANDLE CondVarKeyedEventHandle
#define InterlockedCompareExchangePointerAcquire
#define InitializeListHead(ListHead)
#define InterlockedCompareExchangePointerRelease
VOID NTAPI RtlWakeAllConditionVariable(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable)
static PCOND_VAR_WAIT_ENTRY InternalLockCondVar(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable, IN PCOND_VAR_WAIT_ENTRY InsertEntry OPTIONAL, IN BOOLEAN *AbortIfLocked OPTIONAL)
#define RtlZeroMemory(Destination, Length)
FORCEINLINE BOOLEAN * InternalGetListRemovalHandledFlag(IN PCOND_VAR_WAIT_ENTRY Entry)
VOID NTAPI RtlReleaseSRWLockExclusive(IN OUT PRTL_SRWLOCK SRWLock)
VOID NTAPI RtlInitializeConditionVariable(OUT PRTL_CONDITION_VARIABLE ConditionVariable)
base of all file and directory entries
NTSTATUS NTAPI RtlSleepConditionVariableSRW(IN OUT PRTL_CONDITION_VARIABLE ConditionVariable, IN OUT PRTL_SRWLOCK SRWLock, IN const LARGE_INTEGER *TimeOut OPTIONAL, IN ULONG Flags)
PULONG MinorVersion OPTIONAL