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>
16 #include <internal/ps.h>
19 #include <internal/debug.h>
21 /* FUNCTIONS ****************************************************************/
26 VOID STDCALL
KeClearEvent (PKEVENT Event
)
28 DPRINT("KeClearEvent(Event %x)\n", Event
);
29 Event
->Header
.SignalState
= FALSE
;
35 VOID STDCALL
KeInitializeEvent (PKEVENT Event
,
41 if (Type
== NotificationEvent
)
43 IType
= InternalNotificationEvent
;
45 else if (Type
== SynchronizationEvent
)
47 IType
= InternalSynchronizationEvent
;
55 KeInitializeDispatcherHeader(&(Event
->Header
),
57 sizeof(Event
)/sizeof(ULONG
),State
);
58 InitializeListHead(&(Event
->Header
.WaitListHead
));
64 LONG STDCALL
KeReadStateEvent (PKEVENT Event
)
66 return(Event
->Header
.SignalState
);
72 LONG STDCALL
KeResetEvent (PKEVENT Event
)
74 return(InterlockedExchange(&(Event
->Header
.SignalState
),0));
80 LONG STDCALL
KeSetEvent (PKEVENT Event
,
87 DPRINT("KeSetEvent(Event %x, Wait %x)\n",Event
,Wait
);
89 OldIrql
= KeAcquireDispatcherDatabaseLock();
91 ret
= InterlockedExchange(&(Event
->Header
.SignalState
),1);
93 KeDispatcherObjectWake((DISPATCHER_HEADER
*)Event
);
97 KeReleaseDispatcherDatabaseLock(OldIrql
);
101 KTHREAD
*Thread
= KeGetCurrentThread();
102 Thread
->WaitNext
= Wait
;
103 Thread
->WaitIrql
= OldIrql
;
112 NTSTATUS STDCALL
KePulseEvent (PKEVENT Event
,
119 DPRINT("KePulseEvent(Event %x, Wait %x)\n",Event
,Wait
);
120 OldIrql
= KeAcquireDispatcherDatabaseLock();
121 ret
= InterlockedExchange(&(Event
->Header
.SignalState
),1);
122 KeDispatcherObjectWake((DISPATCHER_HEADER
*)Event
);
123 InterlockedExchange(&(Event
->Header
.SignalState
),0);
127 KeReleaseDispatcherDatabaseLock(OldIrql
);
131 KTHREAD
*Thread
= KeGetCurrentThread();
132 Thread
->WaitNext
= Wait
;
133 Thread
->WaitIrql
= OldIrql
;
136 return ((NTSTATUS
)ret
);