Initial revision
[reactos.git] / reactos / ntoskrnl / ke / event.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/ke/event.c
5 * PURPOSE: Implements event
6 * PROGRAMMER: David Welch (welch@mcmail.com)
7 * UPDATE HISTORY:
8 * Created 22/05/98
9 */
10
11 /* INCLUDES *****************************************************************/
12
13 #include <internal/kernel.h>
14 #include <internal/wait.h>
15
16 #include <ddk/ntddk.h>
17
18 #include <internal/debug.h>
19
20 /* FUNCTIONS ****************************************************************/
21
22 VOID KeClearEvent(PKEVENT Event)
23 {
24 Event->Header.SignalState=FALSE; // (??) Is this atomic
25 }
26
27 VOID KeInitializeEvent(PKEVENT Event, EVENT_TYPE Type, BOOLEAN State)
28 {
29 Event->Header.Type = Type;
30 Event->Header.Absolute = 0;
31 Event->Header.Inserted = 0;
32 Event->Header.Size = sizeof(KEVENT) / sizeof(ULONG);
33 Event->Header.SignalState = State;
34 InitializeListHead(&(Event->Header.WaitListHead));
35 }
36
37 LONG KeReadStateEvent(PKEVENT Event)
38 {
39 return(Event->Header.SignalState);
40 }
41
42 LONG KeResetEvent(PKEVENT Event)
43 {
44 return(InterlockedExchange(&(Event->Header.SignalState),0));
45 }
46
47 LONG KeSetEvent(PKEVENT Event, KPRIORITY Increment, BOOLEAN Wait)
48 {
49 int ret;
50 KIRQL oldlvl;
51
52 KeAcquireSpinLock(&DispatcherDatabaseLock,&oldlvl);
53 ret = InterlockedExchange(&(Event->Header.SignalState),1);
54 KeDispatcherObjectWake((DISPATCHER_HEADER *)Event);
55 KeReleaseSpinLock(&DispatcherDatabaseLock,oldlvl);
56 }