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 *****************************************************************/
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((DISPATCHER_HEADER
*)Event
);
96 KeReleaseDispatcherDatabaseLock(OldIrql
);
100 KTHREAD
*Thread
= KeGetCurrentThread();
101 Thread
->WaitNext
= Wait
;
102 Thread
->WaitIrql
= OldIrql
;
111 NTSTATUS STDCALL
KePulseEvent (PKEVENT Event
,
118 DPRINT("KePulseEvent(Event %x, Wait %x)\n",Event
,Wait
);
119 OldIrql
= KeAcquireDispatcherDatabaseLock();
120 ret
= InterlockedExchange(&(Event
->Header
.SignalState
),1);
121 KiDispatcherObjectWake((DISPATCHER_HEADER
*)Event
);
122 InterlockedExchange(&(Event
->Header
.SignalState
),0);
126 KeReleaseDispatcherDatabaseLock(OldIrql
);
130 KTHREAD
*Thread
= KeGetCurrentThread();
131 Thread
->WaitNext
= Wait
;
132 Thread
->WaitIrql
= OldIrql
;
135 return ((NTSTATUS
)ret
);
143 KeSetEventBoostPriority(
145 IN PKTHREAD
*Thread OPTIONAL
148 PKTHREAD WaitingThread
;
151 OldIrql
= KeAcquireDispatcherDatabaseLock();
153 /* Get Thread that is currently waiting. First get the Wait Block, then the Thread */
154 WaitingThread
= CONTAINING_RECORD(Event
->Header
.WaitListHead
.Flink
, KWAIT_BLOCK
, WaitListEntry
)->Thread
;
156 /* Return it to caller if requested */
157 if ARGUMENT_PRESENT(Thread
) *Thread
= WaitingThread
;
159 /* Reset the Quantum and Unwait the Thread */
160 WaitingThread
->Quantum
= WaitingThread
->ApcState
.Process
->ThreadQuantum
;
161 KiAbortWaitThread(WaitingThread
, STATUS_SUCCESS
);
163 KeReleaseDispatcherDatabaseLock(OldIrql
);