2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: kernel/excutive/resource.c
5 * PURPOSE: Graceful system shutdown if a bug is detected
6 * PROGRAMMER: David Welch (welch@mcmail.com)
11 /* INCLUDES *****************************************************************/
13 #include <ddk/ntddk.h>
15 #include <internal/debug.h>
17 /* FUNCTIONS *****************************************************************/
19 BOOLEAN
ExAcquireResourceExclusive(PERESOURCE Resource
, BOOLEAN Wait
)
24 BOOLEAN
ExAcquireResourceExclusiveLite(PERESOURCE Resource
, BOOLEAN Wait
)
29 BOOLEAN
ExAcquireResourceSharedLite(PERESOURCE Resource
, BOOLEAN Wait
)
34 VOID
ExConvertExclusiveToSharedLite(PERESOURCE Resource
)
39 ULONG
ExGetExclusiveWaiterCount(PERESOURCE Resource
)
44 BOOLEAN
ExAcquireSharedStarveExclusive(PERESOURCE Resource
, BOOLEAN Wait
)
49 BOOLEAN
ExAcquireSharedWaitForExclusive(PERESOURCE Resource
, BOOLEAN Wait
)
54 NTSTATUS
ExDeleteResource(PERESOURCE Resource
)
59 NTSTATUS
ExDeleteResourceLite(PERESOURCE Resource
)
64 ERESOURCE_THREAD
ExGetCurrentResourceThread()
69 ULONG
ExGetSharedWaiterCount(PERESOURCE Resource
)
74 NTSTATUS
ExInitializeResource(PERESOURCE Resource
)
78 NTSTATUS
ExInitializeResourceLite(PERESOURCE Resource
)
80 Resource
->NumberOfSharedWaiters
= 0;
81 Resource
->NumberOfExclusiveWaiters
= 0;
82 KeInitializeSpinLock(&Resource
->SpinLock
);
84 KeInitializeEvent(&Resource
->ExclusiveWaiters
,SynchronizationEvent
,
86 KeInitializeSemaphore(&Resource
->SharedWaiters
,5,0);
87 Resource
->ActiveCount
= 0;
90 BOOLEAN
ExIsResourceAcquiredExclusiveLite(PERESOURCE Resource
)
92 return(Resource
->NumberOfExclusiveWaiters
!=0);
95 BOOLEAN
ExIsResourceAcquiredSharedLite(PERESOURCE Resource
)
97 return(Resource
->NumberOfSharedWaiters
!=0);
100 VOID
ExReinitializeResourceLite(PERESOURCE Resource
)
105 VOID
ExReleaseResource(PERESOURCE Resource
)
110 VOID
ExReleaseResourceForThread(PERESOURCE Resource
,
111 ERESOURCE_THREAD ResourceThreadId
)
116 VOID
ExReleaseResourceForThreadLite(PERESOURCE Resource
,
117 ERESOURCE_THREAD ResourceThreadId
)
122 BOOLEAN
ExTryToAcquireResourceExclusiveLite(PERESOURCE Resource
)
124 LARGE_INTEGER timeout
;
126 SET_LARGE_INTEGER_HIGH_PART(timeout
, 0);
127 SET_LARGE_INTEGER_LOW_PART(timeout
, 0);
128 return KeWaitForSingleObject(&Resource
->ExclusiveWaiters
,
132 &timeout
) == STATUS_SUCCESS
;