:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[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 VOID STDCALL KeClearEvent (PKEVENT Event)
23 {
24    DPRINT("KeClearEvent(Event %x)\n", Event);
25    Event->Header.SignalState = FALSE;
26 }
27
28 VOID STDCALL KeInitializeEvent (PKEVENT         Event,
29                                 EVENT_TYPE      Type,
30                                 BOOLEAN         State)
31 {
32    ULONG IType;
33    
34    if (Type == NotificationEvent)
35      {
36         IType = InternalNotificationEvent;
37      }
38    else if (Type == SynchronizationEvent)
39      {
40         IType = InternalSynchronizationEvent;
41      }
42    else
43      {
44         assert(FALSE);
45         return;
46      }
47    
48    KeInitializeDispatcherHeader(&(Event->Header),
49                                 IType,
50                                 sizeof(Event)/sizeof(ULONG),State);
51    InitializeListHead(&(Event->Header.WaitListHead));
52 }
53
54 LONG STDCALL KeReadStateEvent (PKEVENT Event)
55 {
56    return(Event->Header.SignalState);
57 }
58
59 LONG STDCALL KeResetEvent (PKEVENT Event)
60 {
61    return(InterlockedExchange(&(Event->Header.SignalState),0));
62 }
63
64 LONG STDCALL KeSetEvent (PKEVENT                Event,
65                          KPRIORITY      Increment,
66                          BOOLEAN                Wait)
67 {
68    int ret;
69
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);
75    return(ret);
76 }
77
78 NTSTATUS STDCALL KePulseEvent (PKEVENT          Event,
79                                KPRIORITY        Increment,
80                                BOOLEAN          Wait)
81 {
82    int ret;
83
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);
91 }
92
93 /* EOF */