16 #define IsExclusiveWaiting(r) (r->NumberOfExclusiveWaiters > 0) 17 #define IsSharedWaiting(r) (r->NumberOfSharedWaiters > 0) 18 #define IsOwnedExclusive(r) (r->Flag & ResourceOwnedExclusive) 19 #define IsBoostAllowed(r) (!(r->Flag & ResourceHasDisabledPriorityBoost)) 21 #if (!(defined(CONFIG_SMP)) && !(DBG)) 141 !(
Thread->CombinedApcDisable))
144 DPRINT1(
"EX: resource: APCs still enabled before resource %p acquire/release " 150 #define ExpVerifyResource(r) 151 #define ExpCheckForApcsDisabled(b,r,t) 222 DPRINT1(
"WARNING: Handling race condition\n");
282 DPRINT1(
"WARNING: Handling race condition\n");
334 OldSize =
Owner->TableSize;
386 if (!OldSize) OldSize = 1;
432 while (
Owner->OwnerThread)
491 if ((FirstEntryInelligible) || (
Owner->OwnerThread))
515 if (!
Owner->OwnerThread)
579 if ((OwnerThread->Priority <
Thread->Priority) &&
580 (OwnerThread->Priority < 14))
586 OwnerThread->PriorityDecrement += 14 - OwnerThread->Priority;
589 OwnerThread->Quantum = OwnerThread->QuantumReset;
634 Timeout.QuadPart = 500 * -10000;
660 DPRINT1(
" ActiveEntries = %04lx Flags = %s%s%s\n",
665 DPRINT1(
" NumberOfExclusiveWaiters = %04lx\n",
666 Resource->NumberOfExclusiveWaiters);
667 DPRINT1(
" Thread = %08lx, Count = %02x\n",
681 DPRINT1(
" Thread = %08lx, Count = %02x\n",
825 Resource->NumberOfExclusiveWaiters++;
844 Resource->OwnerEntry.OwnerCount = 1;
905 while (
Resource->ActiveEntries != 0)
923 if (!
Owner)
continue;
933 if (!
Owner)
continue;
952 Owner->OwnerCount = 1;
1005 Resource->OwnerEntry.OwnerCount = 1;
1014 Owner->OwnerCount = 1;
1090 Resource->OwnerEntry.OwnerCount = 1;
1113 if (!
Owner)
goto TryAcquire;
1119 if (!
Owner)
goto TryAcquire;
1125 Owner->OwnerCount++;
1135 Owner->OwnerCount = 1;
1175 Owner->OwnerCount = 1;
1244 Resource->OwnerEntry.OwnerCount = 1;
1267 if (!
Owner)
goto TryAcquire;
1308 Owner->OwnerCount = 1;
1318 if (!
Owner)
goto TryAcquire;
1324 Owner->OwnerCount++;
1334 Owner->OwnerCount = 1;
1375 Owner->OwnerCount = 1;
1423 OldWaiters =
Resource->NumberOfSharedWaiters;
1424 Resource->ActiveEntries += OldWaiters;
1425 Resource->NumberOfSharedWaiters = 0;
1538 return Resource->NumberOfExclusiveWaiters;
1561 return Resource->NumberOfSharedWaiters;
1670 if (!
Resource->ActiveEntries)
return 0;
1772 Owner[
i].OwnerThread = 0;
1783 Semaphore =
Resource->SharedWaiters;
1791 Resource->OwnerEntry.OwnerThread = 0;
1792 Resource->OwnerEntry.OwnerCount = 0;
1794 Resource->NumberOfSharedWaiters = 0;
1795 Resource->NumberOfExclusiveWaiters = 0;
1865 if (--
Resource->OwnerEntry.OwnerCount)
1873 Resource->OwnerEntry.OwnerThread = 0;
1888 Resource->NumberOfSharedWaiters = 0;
1899 Resource->OwnerEntry.OwnerThread = 1;
1900 Resource->OwnerEntry.OwnerCount = 1;
1902 Resource->NumberOfExclusiveWaiters--;
1973 if (--
Owner->OwnerCount)
1981 Owner->OwnerThread = 0;
1992 Resource->OwnerEntry.OwnerThread = 1;
1993 Resource->OwnerEntry.OwnerCount = 1;
1995 Resource->NumberOfExclusiveWaiters--;
2095 Owner->OwnerCount = 0;
2096 Owner->OwnerThread = 0;
2154 Resource->OwnerEntry.OwnerCount = 1;
BOOLEAN NTAPI ExAcquireSharedWaitForExclusive(IN PERESOURCE Resource, IN BOOLEAN Wait)
FORCEINLINE VOID KiReleaseThreadLock(IN PKTHREAD Thread)
ULONG NTAPI ExGetExclusiveWaiterCount(IN PERESOURCE Resource)
#define ExGetCurrentResourceThread()
#define TAG_RESOURCE_SEMAPHORE
ULONG_PTR ERESOURCE_THREAD
LARGE_INTEGER ExShortTime
#define IsExclusiveWaiting(r)
#define ResourceNeverExclusive
NTSTATUS NTAPI ExReinitializeResourceLite(IN PERESOURCE Resource)
POWNER_ENTRY FASTCALL ExpFindFreeEntry(IN PERESOURCE Resource, IN PKLOCK_QUEUE_HANDLE LockHandle)
#define PsGetCurrentThread()
#define ResourceHasDisabledPriorityBoost
#define UNREFERENCED_PARAMETER(P)
_In_ WDFDPC _In_ BOOLEAN Wait
VOID NTAPI ExDisableResourceBoostLite(IN PERESOURCE Resource)
VOID NTAPI ExConvertExclusiveToSharedLite(IN PERESOURCE Resource)
void __cdecl _enable(void)
PVOID NTAPI ExEnterCriticalRegionAndAcquireResourceShared(IN PERESOURCE Resource)
POWNER_ENTRY FASTCALL ExpFindEntryForThread(IN PERESOURCE Resource, IN ERESOURCE_THREAD Thread, IN PKLOCK_QUEUE_HANDLE LockHandle, IN BOOLEAN FirstEntryInelligible)
NTSTATUS NTAPI ExDeleteResourceLite(IN PERESOURCE Resource)
IN PVOID IN PVOID IN USHORT IN USHORT Size
#define IsBoostAllowed(r)
#define InsertTailList(ListHead, Entry)
VOID FASTCALL KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, IN PKLOCK_QUEUE_HANDLE LockHandle)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
BOOLEAN NTAPI KeIsExecutingDpc(VOID)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
struct _KTHREAD * PKTHREAD
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
_Acquires_exclusive_lock_ Resource _Acquires_shared_lock_ Resource _Inout_ PERESOURCE Resource
VOID NTAPI DbgBreakPoint(VOID)
#define ExpVerifyResource(r)
VOID FASTCALL KiSetPriorityThread(IN PKTHREAD Thread, IN KPRIORITY Priority)
static VOID NTAPI SystemThread(_In_ PVOID Context)
#define InterlockedCompareExchangePointer
NTSTATUS NTAPI KeDelayExecutionThread(IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Interval OPTIONAL)
KSPIN_LOCK ExpResourceSpinLock
_In_ PVOID _In_ ULONG Event
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
BOOLEAN NTAPI ExIsResourceAcquiredExclusiveLite(IN PERESOURCE Resource)
FORCEINLINE VOID KiAcquireThreadLock(IN PKTHREAD Thread)
VOID FASTCALL KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle)
ULONG NTAPI ExGetSharedWaiterCount(IN PERESOURCE Resource)
VOID NTAPI KeInitializeSemaphore(IN PKSEMAPHORE Semaphore, IN LONG Count, IN LONG Limit)
FORCEINLINE VOID ExReleaseResourceLock(IN PERESOURCE Resource, IN PKLOCK_QUEUE_HANDLE LockHandle)
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
VOID NTAPI ExpAllocateExclusiveWaiterEvent(IN PERESOURCE Resource, IN PKLOCK_QUEUE_HANDLE LockHandle)
VOID NTAPI ExpResourceInitialization(VOID)
#define IsOwnedExclusive(r)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define TAG_RESOURCE_EVENT
#define ExpCheckForApcsDisabled(b, r, t)
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
FORCEINLINE VOID ExAcquireResourceLock(IN PERESOURCE Resource, IN PKLOCK_QUEUE_HANDLE LockHandle)
#define KeEnterCriticalRegion()
_Must_inspect_result_ _In_ USHORT NewSize
VOID FASTCALL ExReleaseResourceAndLeaveCriticalRegion(IN PERESOURCE Resource)
VOID NTAPI ExSetResourceOwnerPointer(IN PERESOURCE Resource, IN PVOID OwnerPointer)
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
VOID NTAPI ExpAllocateSharedWaiterSemaphore(IN PERESOURCE Resource, IN PKLOCK_QUEUE_HANDLE LockHandle)
PVOID NTAPI ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(IN PERESOURCE Resource)
BOOLEAN NTAPI ExAcquireSharedStarveExclusive(IN PERESOURCE Resource, IN BOOLEAN Wait)
VOID FASTCALL ExpBoostOwnerThread(IN PKTHREAD Thread, IN PKTHREAD OwnerThread)
#define KeLeaveCriticalRegion()
FORCEINLINE VOID KiReleaseDispatcherLock(IN KIRQL OldIrql)
#define KeInitializeEvent(pEvt, foo, foo2)
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
FORCEINLINE KIRQL KiAcquireDispatcherLock(VOID)
LONG NTAPI KeReleaseSemaphore(IN PKSEMAPHORE Semaphore, IN KPRIORITY Increment, IN LONG Adjustment, IN BOOLEAN Wait)
#define InitializeListHead(ListHead)
BOOLEAN NTAPI ExTryToAcquireResourceExclusiveLite(IN PERESOURCE Resource)
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ SaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ OwnerSize PSID Owner
LIST_ENTRY ExpSystemResourcesList
BOOLEAN NTAPI ExAcquireResourceSharedLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
NTSTATUS NTAPI ExInitializeResourceLite(IN PERESOURCE Resource)
VOID NTAPI ExpExpandResourceOwnerTable(IN PERESOURCE Resource, IN PKLOCK_QUEUE_HANDLE LockHandle)
ULONG ExpResourceTimeoutCount
void __cdecl _disable(void)
PVOID NTAPI ExEnterCriticalRegionAndAcquireResourceExclusive(IN PERESOURCE Resource)
ULONG NTAPI ExIsResourceAcquiredSharedLite(IN PERESOURCE Resource)
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
VOID NTAPI ExReleaseResourceForThreadLite(IN PERESOURCE Resource, IN ERESOURCE_THREAD Thread)
VOID NTAPI KeSetEventBoostPriority(IN PKEVENT Event, IN PKTHREAD *WaitingThread OPTIONAL)
*LockHandle LockHandle _Out_ PKLOCK_QUEUE_HANDLE LockHandle
#define IsSharedWaiting(r)
#define KeGetCurrentThread
#define TAG_RESOURCE_TABLE
#define ExFreePoolWithTag(_P, _T)
VOID FASTCALL ExpWaitForResource(IN PERESOURCE Resource, IN PVOID Object)
_In_ LONG _In_ LONG Limit
#define Int32x32To64(a, b)
#define ResourceOwnedExclusive
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)