3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ke/event.c
6 * PURPOSE: Implements events
8 * PROGRAMMERS: David Welch (welch@mcmail.com)
11 /* INCLUDES *****************************************************************/
15 #include <internal/debug.h>
17 /* FUNCTIONS ****************************************************************/
22 VOID STDCALL
KeClearEvent (PKEVENT Event
)
24 DPRINT("KeClearEvent(Event %x)\n", Event
);
25 Event
->Header
.SignalState
= FALSE
;
31 VOID STDCALL
KeInitializeEvent (PKEVENT Event
,
37 if (Type
== NotificationEvent
)
39 IType
= InternalNotificationEvent
;
41 else if (Type
== SynchronizationEvent
)
43 IType
= InternalSynchronizationEvent
;
51 KeInitializeDispatcherHeader(&(Event
->Header
),
53 sizeof(Event
)/sizeof(ULONG
),State
);
54 InitializeListHead(&(Event
->Header
.WaitListHead
));
60 LONG STDCALL
KeReadStateEvent (PKEVENT Event
)
62 return(Event
->Header
.SignalState
);
68 LONG STDCALL
KeResetEvent (PKEVENT Event
)
70 /* FIXME: must use interlocked func. everywhere! (wait.c)
71 * or use dispather lock instead
73 return(InterlockedExchange(&(Event
->Header
.SignalState
),0));
79 LONG STDCALL
KeSetEvent (PKEVENT Event
,
86 DPRINT("KeSetEvent(Event %x, Wait %x)\n",Event
,Wait
);
88 OldIrql
= KeAcquireDispatcherDatabaseLock();
90 ret
= InterlockedExchange(&Event
->Header
.SignalState
,1);
92 KiDispatcherObjectWake(&Event
->Header
, Increment
);
96 KeReleaseDispatcherDatabaseLock(OldIrql
);
100 KTHREAD
*Thread
= KeGetCurrentThread();
101 Thread
->WaitNext
= TRUE
;
102 Thread
->WaitIrql
= OldIrql
;
112 KePulseEvent (IN PKEVENT Event
,
113 IN KPRIORITY Increment
,
119 DPRINT("KePulseEvent(Event %x, Wait %x)\n",Event
,Wait
);
120 OldIrql
= KeAcquireDispatcherDatabaseLock();
121 Ret
= InterlockedExchange(&Event
->Header
.SignalState
,1);
122 KiDispatcherObjectWake(&Event
->Header
, Increment
);
123 InterlockedExchange(&(Event
->Header
.SignalState
),0);
127 KeReleaseDispatcherDatabaseLock(OldIrql
);
131 KTHREAD
*Thread
= KeGetCurrentThread();
132 Thread
->WaitNext
= TRUE
;
133 Thread
->WaitIrql
= OldIrql
;
144 KeSetEventBoostPriority(
146 IN PKTHREAD
*Thread OPTIONAL
149 PKTHREAD WaitingThread
;
152 OldIrql
= KeAcquireDispatcherDatabaseLock();
154 /* Get Thread that is currently waiting. First get the Wait Block, then the Thread */
155 WaitingThread
= CONTAINING_RECORD(Event
->Header
.WaitListHead
.Flink
, KWAIT_BLOCK
, WaitListEntry
)->Thread
;
157 /* Return it to caller if requested */
158 if ARGUMENT_PRESENT(Thread
) *Thread
= WaitingThread
;
160 /* Reset the Quantum and Unwait the Thread */
161 WaitingThread
->Quantum
= WaitingThread
->ApcState
.Process
->ThreadQuantum
;
162 KiAbortWaitThread(WaitingThread
, STATUS_SUCCESS
);
164 KeReleaseDispatcherDatabaseLock(OldIrql
);