24 #define InterlockedBitTestAndSetPointer(ptr,val) InterlockedBitTestAndSet64((PLONGLONG)ptr,(LONGLONG)val) 25 #define InterlockedAddPointer(ptr,val) InterlockedAdd64((PLONGLONG)ptr,(LONGLONG)val) 26 #define InterlockedAndPointer(ptr,val) InterlockedAnd64((PLONGLONG)ptr,(LONGLONG)val) 27 #define InterlockedOrPointer(ptr,val) InterlockedOr64((PLONGLONG)ptr,(LONGLONG)val) 29 #define InterlockedBitTestAndSetPointer(ptr,val) InterlockedBitTestAndSet((PLONG)ptr,(LONG)val) 30 #define InterlockedAddPointer(ptr,val) InterlockedAdd((PLONG)ptr,(LONG)val) 31 #define InterlockedAndPointer(ptr,val) InterlockedAnd((PLONG)ptr,(LONG)val) 32 #define InterlockedOrPointer(ptr,val) InterlockedOr((PLONG)ptr,(LONG)val) 35 #define RTL_SRWLOCK_OWNED_BIT 0 36 #define RTL_SRWLOCK_CONTENDED_BIT 1 37 #define RTL_SRWLOCK_SHARED_BIT 2 38 #define RTL_SRWLOCK_CONTENTION_LOCK_BIT 3 39 #define RTL_SRWLOCK_OWNED (1 << RTL_SRWLOCK_OWNED_BIT) 40 #define RTL_SRWLOCK_CONTENDED (1 << RTL_SRWLOCK_CONTENDED_BIT) 41 #define RTL_SRWLOCK_SHARED (1 << RTL_SRWLOCK_SHARED_BIT) 42 #define RTL_SRWLOCK_CONTENTION_LOCK (1 << RTL_SRWLOCK_CONTENTION_LOCK_BIT) 43 #define RTL_SRWLOCK_MASK (RTL_SRWLOCK_OWNED | RTL_SRWLOCK_CONTENDED | \ 44 RTL_SRWLOCK_SHARED | RTL_SRWLOCK_CONTENTION_LOCK) 45 #define RTL_SRWLOCK_BITS 4 97 if (!FirstWaitBlock->Exclusive)
103 Next->SharedCount = FirstWaitBlock->SharedCount;
108 Next->Last = FirstWaitBlock->Last;
113 if (FirstWaitBlock->Exclusive)
117 ASSERT(FirstWaitBlock->SharedCount > 0);
126 if (FirstWaitBlock->Exclusive)
137 WakeChain = FirstWaitBlock->SharedWakeChain;
140 NextWake = WakeChain->
Next;
145 WakeChain = NextWake;
146 }
while (WakeChain !=
NULL);
162 ASSERT(FirstWaitBlock->Exclusive);
171 Next->Last = FirstWaitBlock->Last;
237 CurrentValue = *(
volatile LONG_PTR *)&SRWLock->Ptr;
242 if (WaitBlock->Wake != 0)
269 if (FirstWait !=
NULL)
271 while (WakeChain->Wake == 0)
282 CurrentValue = *(
volatile LONG_PTR *)&SRWLock->Ptr;
291 if (WakeChain->Wake != 0)
332 CurrentValue = *(
volatile LONG_PTR *)&SRWLock->Ptr;
347 if (
First->Exclusive)
353 Shared =
First->Last;
360 StackWaitBlock.
Last = &StackWaitBlock;
363 Shared->
Next = &StackWaitBlock;
364 First->Last = &StackWaitBlock;
366 Shared = &StackWaitBlock;
367 FirstWait = &StackWaitBlock;
412 (
PVOID)CurrentValue) == CurrentValue)
436 StackWaitBlock.
Last = &StackWaitBlock;
442 Shared =
First->Last;
445 Shared->
Next = &StackWaitBlock;
446 First->Last = &StackWaitBlock;
448 Shared = &StackWaitBlock;
449 FirstWait = &StackWaitBlock;
480 StackWaitBlock.
Last = &StackWaitBlock;
487 (
PVOID)CurrentValue) == CurrentValue)
509 (
PVOID)CurrentValue) == CurrentValue)
532 CurrentValue = *(
volatile LONG_PTR *)&SRWLock->Ptr;
541 if (WaitBlock !=
NULL)
568 (
PVOID)CurrentValue) == CurrentValue)
601 CurrentValue = *(
volatile LONG_PTR *)&SRWLock->Ptr;
618 StackWaitBlock.
Last = &StackWaitBlock;
619 StackWaitBlock.
Wake = 0;
625 (
PVOID)CurrentValue) == CurrentValue)
647 StackWaitBlock.
Last = &StackWaitBlock;
648 StackWaitBlock.
Wake = 0;
655 First->Last = &StackWaitBlock;
673 StackWaitBlock.
Last = &StackWaitBlock;
674 StackWaitBlock.
Wake = 0;
679 (
PVOID)CurrentValue) == CurrentValue)
715 CurrentValue = *(
volatile LONG_PTR *)&SRWLock->Ptr;
729 if (WaitBlock !=
NULL)
749 (
PVOID)CurrentValue) == CurrentValue)
DECLSPEC_NORETURN NTSYSAPI VOID NTAPI RtlRaiseStatus(_In_ NTSTATUS Status)
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
volatile struct _RTLP_SRWLOCK_SHARED_WAKE * Next
#define InterlockedBitTestAndSetPointer(ptr, val)
#define RTL_SRWLOCK_CONTENTION_LOCK
PRTLP_SRWLOCK_SHARED_WAKE LastSharedWake
typedef __ALIGNED(16) struct _EX_PUSH_LOCK_WAIT_BLOCK
struct _RTLP_SRWLOCK_SHARED_WAKE * PRTLP_SRWLOCK_SHARED_WAKE
struct _RTLP_SRWLOCK_SHARED_WAKE RTLP_SRWLOCK_SHARED_WAKE
struct _RTLP_SRWLOCK_WAITBLOCK * PRTLP_SRWLOCK_WAITBLOCK
volatile struct _RTLP_SRWLOCK_WAITBLOCK * Next
static VOID NTAPI RtlpAcquireSRWLockSharedWait(IN OUT PRTL_SRWLOCK SRWLock, IN OUT PRTLP_SRWLOCK_WAITBLOCK FirstWait OPTIONAL, IN OUT PRTLP_SRWLOCK_SHARED_WAKE WakeChain)
FORCEINLINE VOID YieldProcessor(VOID)
VOID NTAPI RtlReleaseSRWLockShared(IN OUT PRTL_SRWLOCK SRWLock)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
VOID NTAPI RtlAcquireSRWLockExclusive(IN OUT PRTL_SRWLOCK SRWLock)
#define RTL_SRWLOCK_CONTENDED
#define InterlockedCompareExchangePointer
volatile struct _RTLP_SRWLOCK_WAITBLOCK * Last
VOID NTAPI RtlInitializeSRWLock(OUT PRTL_SRWLOCK SRWLock)
#define InterlockedExchangePointer(Target, Value)
#define InterlockedOrPointer(ptr, val)
#define InterlockedAndPointer(ptr, val)
#define RTL_SRWLOCK_OWNED
HRESULT Next([in] ULONG celt, [out, size_is(celt), length_is(*pceltFetched)] STATPROPSETSTG *rgelt, [out] ULONG *pceltFetched)
PRTLP_SRWLOCK_SHARED_WAKE SharedWakeChain
VOID NTAPI RtlReleaseSRWLockExclusive(IN OUT PRTL_SRWLOCK SRWLock)
#define RTL_SRWLOCK_SHARED
static VOID NTAPI RtlpReleaseWaitBlockLockLastShared(IN OUT PRTL_SRWLOCK SRWLock, IN PRTLP_SRWLOCK_WAITBLOCK FirstWaitBlock)
static VOID NTAPI RtlpReleaseWaitBlockLockExclusive(IN OUT PRTL_SRWLOCK SRWLock, IN PRTLP_SRWLOCK_WAITBLOCK FirstWaitBlock)
#define STATUS_RESOURCE_NOT_OWNED
VOID NTAPI RtlAcquireSRWLockShared(IN OUT PRTL_SRWLOCK SRWLock)
struct _RTLP_SRWLOCK_WAITBLOCK RTLP_SRWLOCK_WAITBLOCK
#define RTL_SRWLOCK_OWNED_BIT
static PRTLP_SRWLOCK_WAITBLOCK NTAPI RtlpAcquireWaitBlockLock(IN OUT PRTL_SRWLOCK SRWLock)
static VOID NTAPI RtlpAcquireSRWLockExclusiveWait(IN OUT PRTL_SRWLOCK SRWLock, IN PRTLP_SRWLOCK_WAITBLOCK WaitBlock)
static VOID NTAPI RtlpReleaseWaitBlockLock(IN OUT PRTL_SRWLOCK SRWLock)
PULONG MinorVersion OPTIONAL