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 ****************************************************************/
25 VOID STDCALL KeClearEvent (PKEVENT Event)
27 DPRINT("KeClearEvent(Event %x)\n", Event);
28 Event->Header.SignalState = FALSE;
34 VOID STDCALL KeInitializeEvent (PKEVENT Event,
40 if (Type == NotificationEvent)
42 IType = InternalNotificationEvent;
44 else if (Type == SynchronizationEvent)
46 IType = InternalSynchronizationEvent;
54 KeInitializeDispatcherHeader(&(Event->Header),
56 sizeof(Event)/sizeof(ULONG),State);
57 InitializeListHead(&(Event->Header.WaitListHead));
63 LONG STDCALL KeReadStateEvent (PKEVENT Event)
65 return(Event->Header.SignalState);
71 LONG STDCALL KeResetEvent (PKEVENT Event)
73 return(InterlockedExchange(&(Event->Header.SignalState),0));
79 LONG STDCALL KeSetEvent (PKEVENT Event,
85 DPRINT("KeSetEvent(Event %x, Wait %x)\n",Event,Wait);
86 KeAcquireDispatcherDatabaseLock(Wait);
87 ret = InterlockedExchange(&(Event->Header.SignalState),1);
88 KeDispatcherObjectWake((DISPATCHER_HEADER *)Event);
89 KeReleaseDispatcherDatabaseLock(Wait);
96 NTSTATUS STDCALL KePulseEvent (PKEVENT Event,
102 DPRINT("KePulseEvent(Event %x, Wait %x)\n",Event,Wait);
103 KeAcquireDispatcherDatabaseLock(Wait);
104 ret = InterlockedExchange(&(Event->Header.SignalState),1);
105 KeDispatcherObjectWake((DISPATCHER_HEADER *)Event);
106 InterlockedExchange(&(Event->Header.SignalState),0);
107 KeReleaseDispatcherDatabaseLock(Wait);
108 return((NTSTATUS)ret);