ReactOS 0.4.16-dev-1946-g52006dd
eventobj.c File Reference
#include <ntoskrnl.h>
#include <debug.h>
Include dependency graph for eventobj.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

VOID NTAPI KeClearEvent (IN PKEVENT Event)
 
VOID NTAPI KeInitializeEvent (OUT PKEVENT Event, IN EVENT_TYPE Type, IN BOOLEAN State)
 
VOID NTAPI KeInitializeEventPair (IN PKEVENT_PAIR EventPair)
 
LONG NTAPI KePulseEvent (IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
 
LONG NTAPI KeReadStateEvent (IN PKEVENT Event)
 
LONG NTAPI KeResetEvent (IN PKEVENT Event)
 
LONG NTAPI KeSetEvent (IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
 
VOID NTAPI KeSetEventBoostPriority (IN PKEVENT Event, IN PKTHREAD *WaitingThread OPTIONAL)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file eventobj.c.

Function Documentation

◆ KeClearEvent()

VOID NTAPI KeClearEvent ( IN PKEVENT  Event)

Definition at line 22 of file eventobj.c.

23{
25
26 /* Reset Signal State */
27 Event->Header.SignalState = FALSE;
28}
#define FALSE
Definition: types.h:117
#define ASSERT_EVENT(Object)

Referenced by __brelse(), _Function_class_(), _Requires_lock_held_(), acpi_bus_receive_event(), add_calc_job_comp(), add_calc_job_decomp(), AfdEnumEvents(), CdWaitSync(), ChewCreate(), chunk_lock_range(), MxEvent::Clear(), do_calc_job(), DpcRoutine(), DriverIoControl(), EngClearEvent(), ExSwapinWorkerThreads(), Ext2bhReaperThread(), Ext2FcbReaperThread(), Ext2McbReaperThread(), Ext2ReadWriteBlocks(), ExUnregisterCallback(), FatWaitSync(), FinishThread(), FreeBT_IoIncrement(), IdlePong(), InitController(), IoCancelFileOpen(), IopCloseFile(), IopDeleteFile(), IopDeviceFsIoControl(), IopGetSetSecurityObject(), IopMountVolume(), IopQueryDeviceInformation(), IopShutdownBaseFileSystems(), IoSetInformation(), IoShutdownSystem(), KbdHid_Create(), KsQueryInformationFile(), KsQueueWorkItem(), KsReadFile(), KsStreamIo(), KsWriteFile(), lock_volume(), MiDecrementAvailablePages(), MiIncrementAvailablePages(), MiInitializePoolEvents(), MiNotifyMemoryEvents(), MmZeroPageThread(), MouHid_Create(), MountMgrUnload(), NdisMAllocateMapRegisters(), NdisResetEvent(), NtClearEvent(), NtFlushBuffersFile(), NtLockFile(), NtNotifyChangeDirectoryFile(), NtQueryDirectoryFile(), NtQueryInformationFile(), NtQueryVolumeInformationFile(), NtReadFile(), NtReplyWaitReceivePortEx(), NtSetInformationFile(), NtSetVolumeInformationFile(), NtUnlockFile(), NtWaitForDebugEvent(), NtWriteFile(), pause_balance(), pause_scrub(), PiQueueDeviceAction(), RawQueryFsSizeInfo(), read_send_buffer(), ReadBytes(), ReadWritePassive(), Recalibrate(), ReceiveDatagram(), ResetChangeFlag(), RWDetermineMediaType(), RWSeekToCylinder(), RxCommonWrite(), RxScavengerTimerRoutine(), RxSpinUpRequestsDispatcher(), SermouseDeviceWorker(), StopMotor(), StreamClassStartDevice(), SubmitIdleRequestIrp(), TestEventFunctional(), TestTcpConnect(), TriggerWork(), USBD_RegisterRootHubCallBack(), USBH_ChangeIndication(), USBH_CheckHubIdle(), USBH_SubmitStatusChangeTransfer(), USBPORT_WorkerThread(), USBSTOR_QueueAddIrp(), VideoPortClearEvent(), wait_for_flush(), WaitForControllerInterrupt(), and xHalIoSetPartitionInformation().

◆ KeInitializeEvent()

VOID NTAPI KeInitializeEvent ( OUT PKEVENT  Event,
IN EVENT_TYPE  Type,
IN BOOLEAN  State 
)

Definition at line 35 of file eventobj.c.

38{
39 /* Initialize the Dispatcher Header */
41 Event->Header.Type = EventNotificationObject + Type;
42 //Event->Header.Signalling = FALSE; // fails in kmtest
43 Event->Header.Size = sizeof(KEVENT) / sizeof(ULONG);
44 Event->Header.SignalState = State;
45 InitializeListHead(&(Event->Header.WaitListHead));
46}
Type
Definition: Type.h:7
#define KEVENT
Definition: env_spec_w32.h:69
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define ASSERT(a)
Definition: mode.c:44
@ EventNotificationObject
Definition: ketypes.h:406
@ NotificationEvent
@ SynchronizationEvent
uint32_t ULONG
Definition: typedefs.h:59

◆ KeInitializeEventPair()

VOID NTAPI KeInitializeEventPair ( IN PKEVENT_PAIR  EventPair)

Definition at line 53 of file eventobj.c.

54{
55 /* Initialize the Event Pair Type and Size */
56 EventPair->Type = EventPairObject;
57 EventPair->Size = sizeof(KEVENT_PAIR);
58
59 /* Initialize the two Events */
60 KeInitializeEvent(&EventPair->LowEvent, SynchronizationEvent, FALSE);
61 KeInitializeEvent(&EventPair->HighEvent, SynchronizationEvent, FALSE);
62}
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
@ EventPairObject
Definition: ketypes.h:427
struct _KEVENT_PAIR KEVENT_PAIR

◆ KePulseEvent()

LONG NTAPI KePulseEvent ( IN PKEVENT  Event,
IN KPRIORITY  Increment,
IN BOOLEAN  Wait 
)

Definition at line 69 of file eventobj.c.

72{
78
79 /* Lock the Dispatcher Database */
81
82 /* Save the Old State */
83 PreviousState = Event->Header.SignalState;
84
85 /* Check if we are non-signaled and we have stuff in the Wait Queue */
86 if (!PreviousState && !IsListEmpty(&Event->Header.WaitListHead))
87 {
88 /* Set the Event to Signaled */
89 Event->Header.SignalState = 1;
90
91 /* Wake the Event */
92 KiWaitTest(&Event->Header, Increment);
93 }
94
95 /* Unsignal it */
96 Event->Header.SignalState = 0;
97
98 /* Check what wait state was requested */
99 if (Wait == FALSE)
100 {
101 /* Wait not requested, release Dispatcher Database and return */
103 }
104 else
105 {
106 /* Return Locked and with a Wait */
108 Thread->WaitNext = TRUE;
109 Thread->WaitIrql = OldIrql;
110 }
111
112 /* Return the previous State */
113 return PreviousState;
114}
#define TRUE
Definition: types.h:120
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define DISPATCH_LEVEL
Definition: env_spec_w32.h:696
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG Increment
Definition: CrNtStubs.h:46
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
#define KeGetCurrentThread
Definition: hal.h:55
FORCEINLINE VOID KiReleaseDispatcherLock(IN KIRQL OldIrql)
Definition: ke_x.h:157
FORCEINLINE KIRQL KiAcquireDispatcherLock(VOID)
Definition: ke_x.h:149
VOID FASTCALL KiWaitTest(PVOID Object, KPRIORITY Increment)
long LONG
Definition: pedump.c:60
#define ASSERT_IRQL_LESS_OR_EQUAL(x)
Definition: debug.h:251
_In_ WDF_POWER_DEVICE_STATE PreviousState
Definition: wdfdevice.h:829
_In_ WDFDPC _In_ BOOLEAN Wait
Definition: wdfdpc.h:170
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778

Referenced by EngMapEvent(), NtPulseEvent(), START_TEST(), and TestEventFunctional().

◆ KeReadStateEvent()

LONG NTAPI KeReadStateEvent ( IN PKEVENT  Event)

◆ KeResetEvent()

LONG NTAPI KeResetEvent ( IN PKEVENT  Event)

Definition at line 134 of file eventobj.c.

135{
140
141 /* Lock the Dispatcher Database */
143
144 /* Save the Previous State */
145 PreviousState = Event->Header.SignalState;
146
147 /* Set it to zero */
148 Event->Header.SignalState = 0;
149
150 /* Release Dispatcher Database and return previous state */
152 return PreviousState;
153}

Referenced by MmRebalanceMemoryConsumersAndWait(), NtResetEvent(), and TestEventFunctional().

◆ KeSetEvent()

LONG NTAPI KeSetEvent ( IN PKEVENT  Event,
IN KPRIORITY  Increment,
IN BOOLEAN  Wait 
)

Definition at line 160 of file eventobj.c.

163{
169
170 /*
171 * Check if this is an signaled notification event without an upcoming wait.
172 * In this case, we can immediately return TRUE, without locking.
173 */
174 if ((Event->Header.Type == EventNotificationObject) &&
175 (Event->Header.SignalState == 1) &&
176 !(Wait))
177 {
178 /* Return the signal state (TRUE/Signalled) */
179 return TRUE;
180 }
181
182 /* Lock the Dispathcer Database */
184
185 /* Save the Previous State */
186 PreviousState = Event->Header.SignalState;
187
188 /* Set the Event to Signaled */
189 Event->Header.SignalState = 1;
190
191 /* Check if the event just became signaled now, and it has waiters */
192 if (!(PreviousState) && !(IsListEmpty(&Event->Header.WaitListHead)))
193 {
194 /* Check the type of event */
195 if (Event->Header.Type == EventNotificationObject)
196 {
197 /* Unwait the thread */
198 KxUnwaitThread(&Event->Header, Increment);
199 }
200 else
201 {
202 /* Otherwise unwait the thread and unsignal the event */
204 }
205 }
206
207 /* Check what wait state was requested */
208 if (!Wait)
209 {
210 /* Wait not requested, release Dispatcher Database and return */
212 }
213 else
214 {
215 /* Return Locked and with a Wait */
217 Thread->WaitNext = TRUE;
218 Thread->WaitIrql = OldIrql;
219 }
220
221 /* Return the previous State */
222 return PreviousState;
223}
FORCEINLINE VOID KxUnwaitThread(IN DISPATCHER_HEADER *Object, IN KPRIORITY Increment)
Definition: ke_x.h:1259
FORCEINLINE VOID KxUnwaitThreadForEvent(IN PKEVENT Event, IN KPRIORITY Increment)
Definition: ke_x.h:1304

◆ KeSetEventBoostPriority()

VOID NTAPI KeSetEventBoostPriority ( IN PKEVENT  Event,
IN PKTHREAD *WaitingThread  OPTIONAL 
)

Definition at line 230 of file eventobj.c.

232{
234 PKWAIT_BLOCK WaitBlock;
235 PKTHREAD Thread = KeGetCurrentThread(), WaitThread;
236 ASSERT(Event->Header.Type == EventSynchronizationObject);
238
239 /* Acquire Dispatcher Database Lock */
241
242 /* Check if the list is empty */
243 if (IsListEmpty(&Event->Header.WaitListHead))
244 {
245 /* Set the Event to Signaled */
246 Event->Header.SignalState = 1;
247
248 /* Return */
250 return;
251 }
252
253 /* Get the Wait Block */
254 WaitBlock = CONTAINING_RECORD(Event->Header.WaitListHead.Flink,
256 WaitListEntry);
257
258 /* Check if this is a WaitAll */
259 if (WaitBlock->WaitType == WaitAll)
260 {
261 /* Set the Event to Signaled */
262 Event->Header.SignalState = 1;
263
264 /* Unwait the thread and unsignal the event */
266 }
267 else
268 {
269 /* Return waiting thread to caller */
270 WaitThread = WaitBlock->Thread;
271 if (WaitingThread) *WaitingThread = WaitThread;
272
273 /* Calculate new priority */
274 Thread->Priority = KiComputeNewPriority(Thread, 0);
275
276 /* Unlink the waiting thread */
277 KiUnlinkThread(WaitThread, STATUS_SUCCESS);
278
279 /* Request priority boosting */
280 WaitThread->AdjustIncrement = Thread->Priority;
281 WaitThread->AdjustReason = AdjustBoost;
282
283 /* Ready the thread */
284 KiReadyThread(WaitThread);
285 }
286
287 /* Release the Dispatcher Database Lock */
289}
FORCEINLINE SCHAR KiComputeNewPriority(IN PKTHREAD Thread, IN SCHAR Adjustment)
Definition: ke_x.h:1472
@ EventSynchronizationObject
Definition: ketypes.h:407
@ AdjustBoost
Definition: ketypes.h:441
@ WaitAll
VOID NTAPI KiReadyThread(IN PKTHREAD Thread)
Definition: thrdschd.c:502
VOID FASTCALL KiUnlinkThread(IN PKTHREAD Thread, IN LONG_PTR WaitStatus)
Definition: wait.c:55
#define STATUS_SUCCESS
Definition: shellext.h:65
struct _KTHREAD * Thread
Definition: ketypes.h:517
UCHAR WaitType
Definition: ketypes.h:510
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
#define EVENT_INCREMENT
Definition: iotypes.h:597

Referenced by _ExReleaseFastMutex(), _ExReleaseFastMutexUnsafe(), ExfUnblockPushLock(), ExReleaseResourceForThreadLite(), and NtSetEventBoostPriority().