2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/ke/event.c
5 * PURPOSE: Implements events
6 * PROGRAMMER: David Welch (welch@mcmail.com)
11 /* INCLUDES *****************************************************************/
13 #include <ddk/ntddk.h>
14 #include <internal/ke.h>
15 #include <internal/id.h>
18 #include <internal/debug.h>
20 /* FUNCTIONS ****************************************************************/
22 VOID STDCALL KeClearEvent (PKEVENT Event)
24 DPRINT("KeClearEvent(Event %x)\n", Event);
25 Event->Header.SignalState = FALSE;
28 VOID STDCALL KeInitializeEvent (PKEVENT Event,
34 if (Type == NotificationEvent)
36 IType = InternalNotificationEvent;
38 else if (Type == SynchronizationEvent)
40 IType = InternalSynchronizationEvent;
48 KeInitializeDispatcherHeader(&(Event->Header),
50 sizeof(Event)/sizeof(ULONG),State);
51 InitializeListHead(&(Event->Header.WaitListHead));
54 LONG STDCALL KeReadStateEvent (PKEVENT Event)
56 return(Event->Header.SignalState);
59 LONG STDCALL KeResetEvent (PKEVENT Event)
61 return(InterlockedExchange(&(Event->Header.SignalState),0));
64 LONG STDCALL KeSetEvent (PKEVENT Event,
70 DPRINT("KeSetEvent(Event %x, Wait %x)\n",Event,Wait);
71 KeAcquireDispatcherDatabaseLock(Wait);
72 ret = InterlockedExchange(&(Event->Header.SignalState),1);
73 KeDispatcherObjectWake((DISPATCHER_HEADER *)Event);
74 KeReleaseDispatcherDatabaseLock(Wait);
78 NTSTATUS STDCALL KePulseEvent (PKEVENT Event,
84 DPRINT("KePulseEvent(Event %x, Wait %x)\n",Event,Wait);
85 KeAcquireDispatcherDatabaseLock(Wait);
86 ret = InterlockedExchange(&(Event->Header.SignalState),1);
87 KeDispatcherObjectWake((DISPATCHER_HEADER *)Event);
88 InterlockedExchange(&(Event->Header.SignalState),0);
89 KeReleaseDispatcherDatabaseLock(Wait);
90 return((NTSTATUS)ret);