VOID KeReleaseDispatcherDatabaseLock(KIRQL Irql);
VOID KeReleaseDispatcherDatabaseLockFromDpcLevel(VOID);
-BOOLEAN KeDispatcherObjectWake(DISPATCHER_HEADER* hdr);
+BOOLEAN KiDispatcherObjectWake(DISPATCHER_HEADER* hdr);
VOID STDCALL KeExpireTimers(PKDPC Apc,
PVOID Arg1,
PVOID Arg2,
ULONG Size, ULONG SignalState);
VOID KeDumpStackFrames(PULONG Frame);
BOOLEAN KiTestAlert(VOID);
-VOID KeRemoveAllWaitsThread(struct _ETHREAD* Thread, NTSTATUS WaitStatus, BOOL Unblock);
+
+BOOLEAN KiAbortWaitThread(struct _KTHREAD* Thread, NTSTATUS WaitStatus);
+
PULONG KeGetStackTopThread(struct _ETHREAD* Thread);
VOID KeContextToTrapFrame(PCONTEXT Context, PKTRAP_FRAME TrapFrame);
VOID STDCALL KiDeliverApc(KPROCESSOR_MODE PreviousMode,
-/* $Id: usercall.c,v 1.31 2004/11/10 02:51:00 ion Exp $
+/* $Id: usercall.c,v 1.32 2004/11/21 18:42:58 gdalsnes Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
VOID
KiAfterSystemCallHook(PKTRAP_FRAME TrapFrame)
{
- if (KeGetCurrentThread()->Alerted[1] != 0 && TrapFrame->Cs != KERNEL_CS)
- {
- KiDeliverApc(KernelMode, NULL, NULL);
- }
- if (KeGetCurrentThread()->Alerted[0] != 0 && TrapFrame->Cs != KERNEL_CS)
- {
+ KIRQL oldIrql;
+
+ /* If we are returning to umode, deliver one pending umode apc.
+ * Note that kmode apcs are also delivered, even if deliverymode is UserMode.
+ * This is because we can't return to umode with pending kmode apcs!
+ * FIXME: Should we deliver pending kmode apcs when returning from a
+ * kmode-to-kmode syscall (ZwXxx calls)?????
+ * -Gunnar
+ */
+ if (TrapFrame->Cs != KERNEL_CS)
+ {
+ KeRaiseIrql(APC_LEVEL, &oldIrql);
KiDeliverApc(UserMode, NULL, TrapFrame);
- }
+ KeLowerIrql(oldIrql);
+ }
+
}
-/* $Id: kill.c,v 1.85 2004/11/20 23:46:37 blight Exp $
+/* $Id: kill.c,v 1.86 2004/11/21 18:42:58 gdalsnes Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
DPRINT("terminating %x\n",CurrentThread);
+ CurrentThread->HasTerminated = TRUE;
CurrentThread->ExitStatus = ExitStatus;
KeQuerySystemTime((PLARGE_INTEGER)&CurrentThread->ExitTime);
KeCancelTimer(&CurrentThread->Tcb.Timer);
oldIrql = KeAcquireDispatcherDatabaseLock();
CurrentThread->Tcb.DispatcherHeader.SignalState = TRUE;
- KeDispatcherObjectWake(&CurrentThread->Tcb.DispatcherHeader);
+ KiDispatcherObjectWake(&CurrentThread->Tcb.DispatcherHeader);
KeReleaseDispatcherDatabaseLock (oldIrql);
/* The last thread shall close the door on exit */
#ifdef _ENABLE_THRDEVTPAIR
ExpSwapThreadEventPair(CurrentThread, NULL); /* Release the associated eventpair object, if there was one */
#endif /* _ENABLE_THRDEVTPAIR */
- KeRemoveAllWaitsThread (CurrentThread, STATUS_UNSUCCESSFUL, FALSE);
+ ASSERT(CurrentThread->Tcb.WaitBlockList == NULL);
+
PsDispatchThreadNoLock(THREAD_STATE_TERMINATED_1);
DPRINT1("Unexpected return, CurrentThread %x PsGetCurrentThread() %x\n", CurrentThread, PsGetCurrentThread());
KEBUGCHECK(0);
*/
{
PKAPC Apc;
- NTSTATUS Status;
+ KIRQL OldIrql;
DPRINT("PsTerminateOtherThread(Thread %x, ExitStatus %x)\n",
Thread, ExitStatus);
NULL,
NULL,
IO_NO_INCREMENT);
+
+ OldIrql = KeAcquireDispatcherDatabaseLock();
if (THREAD_STATE_BLOCKED == Thread->Tcb.State && UserMode == Thread->Tcb.WaitMode)
{
DPRINT("Unblocking thread\n");
- Status = STATUS_THREAD_IS_TERMINATING;
- KeRemoveAllWaitsThread(Thread, Status, TRUE);
+ KiAbortWaitThread((PKTHREAD)Thread, STATUS_THREAD_IS_TERMINATING);
}
+ KeReleaseDispatcherDatabaseLock(OldIrql);
}
NTSTATUS STDCALL
}
OldIrql = KeAcquireDispatcherDatabaseLock ();
Process->Pcb.DispatcherHeader.SignalState = TRUE;
- KeDispatcherObjectWake(&Process->Pcb.DispatcherHeader);
+ KiDispatcherObjectWake(&Process->Pcb.DispatcherHeader);
KeReleaseDispatcherDatabaseLock (OldIrql);
ObDereferenceObject(Process);
return(STATUS_SUCCESS);