25#define InterlockedAndPointer(ptr,val) InterlockedAnd64((PLONGLONG)ptr,(LONGLONG)val)
27#define InterlockedAndPointer(ptr,val) InterlockedAnd((PLONG)ptr,(LONG)val)
93 NewValue.
Value = OldValue.
Value &~ EX_PUSH_LOCK_WAKING;
113 WaitBlock = FirstWaitBlock;
119 LastWaitBlock = WaitBlock->Last;
125 WaitBlock = LastWaitBlock;
130 PreviousWaitBlock = WaitBlock;
133 WaitBlock = WaitBlock->Next;
136 WaitBlock->Previous = PreviousWaitBlock;
140 PreviousWaitBlock = WaitBlock->Previous;
142 !(PreviousWaitBlock))
160 FirstWaitBlock->Last = PreviousWaitBlock;
161 WaitBlock->Previous =
NULL;
164 ASSERT(FirstWaitBlock != WaitBlock);
177 if (WaitBlock->Previous)
187 PreviousWaitBlock = WaitBlock->Previous;
190 ASSERT(!WaitBlock->Signaled);
194 WaitBlock->Signaled =
TRUE;
205 WaitBlock = PreviousWaitBlock;
206 if (!WaitBlock)
break;
250 OldValue = InitialValue;
271 FirstWaitBlock = WaitBlock;
279 LastWaitBlock = WaitBlock->Last;
283 FirstWaitBlock->Last = LastWaitBlock;
287 PreviousWaitBlock = WaitBlock;
289 WaitBlock = WaitBlock->Next;
292 WaitBlock->Previous = PreviousWaitBlock;
299 NewValue.
Value = OldValue.
Value &~ EX_PUSH_LOCK_WAKING;
458 OldValue = *PushLock;
464 WaitBlock->Next = OldValue.
Ptr;
470 if (OldValue.
Ptr == NewValue.
Ptr)
break;
516 OldValue.
Ptr) != OldValue.
Ptr)
519 OldValue = *PushLock;
531 WaitBlock->Previous =
NULL;
538 WaitBlock->Last =
NULL;
541 WaitBlock->ShareCount = 0;
560 WaitBlock->Last = WaitBlock;
563 WaitBlock->ShareCount = (
LONG)OldValue.
Shared;
577 WaitBlock->ShareCount = 0;
588 WaitBlock->Signaled = 0;
589 WaitBlock->OldValue = OldValue;
590 WaitBlock->NewValue = NewValue;
591 WaitBlock->PushLock = PushLock;
599 TempValue = NewValue;
603 if (NewValue.Value != OldValue.
Value)
606 OldValue = *PushLock;
641 ASSERT(WaitBlock->Signaled);
645 ASSERT((WaitBlock->ShareCount == 0));
703 if (NewValue.Value != OldValue.
Value)
706 OldValue = *PushLock;
717 WaitBlock->ShareCount = 0;
719 WaitBlock->Previous =
NULL;
729 WaitBlock->Last =
NULL;
744 WaitBlock->Last = WaitBlock;
757 WaitBlock->Signaled = 0;
758 WaitBlock->OldValue = OldValue;
759 WaitBlock->NewValue = NewValue;
760 WaitBlock->PushLock = PushLock;
764 TempValue = NewValue;
768 if (NewValue.Ptr != OldValue.
Ptr)
771 OldValue = *PushLock;
806 ASSERT(WaitBlock->Signaled);
810 ASSERT((WaitBlock->ShareCount == 0));
866 if (NewValue.Value == OldValue.
Value)
return;
893 LastWaitBlock = WaitBlock->Last;
896 WaitBlock = LastWaitBlock;
900 WaitBlock = WaitBlock->Next;
907 if (WaitBlock->ShareCount > 0)
930 NewValue.Value = OldValue.
Value;
931 NewValue.MultipleShared =
FALSE;
932 NewValue.Locked =
FALSE;
934 ASSERT(NewValue.Waking && !NewValue.Locked && !NewValue.MultipleShared);
939 if (NewValue.Value == OldValue.
Value)
return;
948 NewValue.Value = OldValue.
Value;
949 NewValue.MultipleShared =
FALSE;
950 NewValue.Locked =
FALSE;
952 NewValue.Waking =
TRUE;
954 ASSERT(NewValue.Waking && !NewValue.Locked && !NewValue.MultipleShared);
956 WakeValue = NewValue;
960 if (NewValue.Value == OldValue.
Value)
1015 NewValue = OldValue;
1026 if (NewValue.Value == OldValue.
Value)
return;
1028 OldValue = NewValue;
1051 LastWaitBlock = WaitBlock->Last;
1054 WaitBlock = LastWaitBlock;
1058 WaitBlock = WaitBlock->Next;
1062 ASSERT(WaitBlock->ShareCount > 0);
1082 NewValue.Value = OldValue.
Value;
1083 NewValue.MultipleShared =
FALSE;
1084 NewValue.Locked =
FALSE;
1086 ASSERT(NewValue.Waking && !NewValue.Locked && !NewValue.MultipleShared);
1091 if (NewValue.Value == OldValue.
Value)
return;
1100 NewValue.Value = OldValue.
Value;
1101 NewValue.MultipleShared =
FALSE;
1102 NewValue.Locked =
FALSE;
1104 NewValue.Waking =
TRUE;
1106 ASSERT(NewValue.Waking && !NewValue.Locked && !NewValue.MultipleShared);
1108 WakeValue = NewValue;
1112 if (NewValue.Value == OldValue.
Value)
1124 OldValue = NewValue;
1162 NewValue.
Value = (OldValue.
Value &~ EX_PUSH_LOCK_LOCK) |
1169 WakeValue = NewValue;
1185 NewValue.
Value = OldValue.
Value &~ EX_PUSH_LOCK_LOCK;
1200 OldValue = NewValue;
1231 NewValue = OldValue;
1237 OldValue.
Ptr) == OldValue.
Ptr)
1261 PVOID CurrentWaitBlock)
1277 NextWaitBlock = WaitBlock->Next;
1287 WaitBlock = NextWaitBlock;
1295 if ((CurrentWaitBlock) &&
#define EX_PUSH_LOCK_PTR_BITS
#define EX_PUSH_LOCK_LOCK
#define EX_PUSH_LOCK_MULTIPLE_SHARED
#define EX_PUSH_LOCK_WAITING
#define EX_PUSH_LOCK_WAKING
#define InterlockedDecrement
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
#define InterlockedExchangePointer(Target, Value)
#define KeRaiseIrql(irql, oldIrql)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeLowerIrql(oldIrql)
VOID NTAPI KeSetEventBoostPriority(IN PKEVENT Event, IN PKTHREAD *WaitingThread OPTIONAL)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define InterlockedCompareExchangePointer
#define InterlockedBitTestAndReset
#define EX_PUSH_LOCK_FLAGS_WAIT_V
* PEX_PUSH_LOCK_WAIT_BLOCK
#define EX_PUSH_LOCK_FLAGS_EXCLUSIVE
#define EX_PUSH_LOCK_FLAGS_WAIT
VOID FASTCALL KeWaitForGate(PKGATE Gate, KWAIT_REASON WaitReason, KPROCESSOR_MODE WaitMode)
VOID FASTCALL KeSignalGateBoostPriority(PKGATE Gate)
VOID FASTCALL KeInitializeGate(PKGATE Gate)
NTSTATUS FASTCALL ExTimedWaitForUnblockPushLock(IN PEX_PUSH_LOCK PushLock, IN PVOID WaitBlock, IN PLARGE_INTEGER Timeout)
VOID FASTCALL ExfReleasePushLock(PEX_PUSH_LOCK PushLock)
VOID NTAPI ExpInitializePushLocks(VOID)
VOID FASTCALL ExWaitForUnblockPushLock(IN PEX_PUSH_LOCK PushLock, IN PVOID WaitBlock)
VOID FASTCALL ExfTryToWakePushLock(PEX_PUSH_LOCK PushLock)
VOID FASTCALL ExfReleasePushLockShared(PEX_PUSH_LOCK PushLock)
VOID FASTCALL ExfReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
ULONG ExPushLockSpinCount
VOID FASTCALL ExfWakePushLock(PEX_PUSH_LOCK PushLock, EX_PUSH_LOCK OldValue)
VOID FASTCALL ExfAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
VOID FASTCALL ExfUnblockPushLock(PEX_PUSH_LOCK PushLock, PVOID CurrentWaitBlock)
VOID FASTCALL ExBlockPushLock(PEX_PUSH_LOCK PushLock, PVOID pWaitBlock)
#define InterlockedAndPointer(ptr, val)
VOID FASTCALL ExfAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
VOID FASTCALL ExpOptimizePushLockList(PEX_PUSH_LOCK PushLock, EX_PUSH_LOCK InitialValue)
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql