update for HEAD-2003091401
[reactos.git] / 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 events
6  * PROGRAMMER:      David Welch (welch@mcmail.com)
7  * UPDATE HISTORY:
8  *                  Created 22/05/98
9  */
10
11 /* INCLUDES *****************************************************************/
12
13 #include <ddk/ntddk.h>
14 #include <internal/ke.h>
15 #include <internal/id.h>
16
17 #define NDEBUG
18 #include <internal/debug.h>
19
20 /* FUNCTIONS ****************************************************************/
21
22 /*
23  * @implemented
24  */
25 VOID STDCALL KeClearEvent (PKEVENT Event)
26 {
27    DPRINT("KeClearEvent(Event %x)\n", Event);
28    Event->Header.SignalState = FALSE;
29 }
30
31 /*
32  * @implemented
33  */
34 VOID STDCALL KeInitializeEvent (PKEVENT         Event,
35                                 EVENT_TYPE      Type,
36                                 BOOLEAN         State)
37 {
38    ULONG IType;
39    
40    if (Type == NotificationEvent)
41      {
42         IType = InternalNotificationEvent;
43      }
44    else if (Type == SynchronizationEvent)
45      {
46         IType = InternalSynchronizationEvent;
47      }
48    else
49      {
50         assert(FALSE);
51         return;
52      }
53    
54    KeInitializeDispatcherHeader(&(Event->Header),
55                                 IType,
56                                 sizeof(Event)/sizeof(ULONG),State);
57    InitializeListHead(&(Event->Header.WaitListHead));
58 }
59
60 /*
61  * @implemented
62  */
63 LONG STDCALL KeReadStateEvent (PKEVENT Event)
64 {
65    return(Event->Header.SignalState);
66 }
67
68 /*
69  * @implemented
70  */
71 LONG STDCALL KeResetEvent (PKEVENT Event)
72 {
73    return(InterlockedExchange(&(Event->Header.SignalState),0));
74 }
75
76 /*
77  * @implemented
78  */
79 LONG STDCALL KeSetEvent (PKEVENT                Event,
80                          KPRIORITY      Increment,
81                          BOOLEAN                Wait)
82 {
83    int ret;
84
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);
90    return(ret);
91 }
92
93 /*
94  * @implemented
95  */
96 NTSTATUS STDCALL KePulseEvent (PKEVENT          Event,
97                                KPRIORITY        Increment,
98                                BOOLEAN          Wait)
99 {
100    int ret;
101
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);
109 }
110
111 /* EOF */