kill.c: remove useless call to KeRemoveAllWaitsThread + misc

usecall.c: fix apc delivery
debug.c: add irql asserts

svn path=/trunk/; revision=11759
This commit is contained in:
Gunnar Dalsnes 2004-11-21 18:42:58 +00:00
parent e4a0875a54
commit b424efdf6b
4 changed files with 35 additions and 18 deletions

View file

@ -124,7 +124,10 @@
* ARGUMENTS: * ARGUMENTS:
* x = Maximum irql * x = Maximum irql
*/ */
#define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql()<=(x)) #define ASSERT_IRQL_LESS_OR_EQUAL(x) ASSERT(KeGetCurrentIrql()<=(x))
#define ASSERT_IRQL(x) ASSERT_IRQL_LESS_OR_EQUAL(x)
#define ASSERT_IRQL_EQUAL(x) ASSERT(KeGetCurrentIrql()==(x))
#define ASSERT_IRQL_LESS(x) ASSERT(KeGetCurrentIrql()<(x))
#define assert_irql(x) assert(KeGetCurrentIrql()<=(x)) #define assert_irql(x) assert(KeGetCurrentIrql()<=(x))
#endif /* __INTERNAL_DEBUG */ #endif /* __INTERNAL_DEBUG */

View file

@ -72,7 +72,7 @@ VOID KeAcquireDispatcherDatabaseLockAtDpcLevel(VOID);
VOID KeReleaseDispatcherDatabaseLock(KIRQL Irql); VOID KeReleaseDispatcherDatabaseLock(KIRQL Irql);
VOID KeReleaseDispatcherDatabaseLockFromDpcLevel(VOID); VOID KeReleaseDispatcherDatabaseLockFromDpcLevel(VOID);
BOOLEAN KeDispatcherObjectWake(DISPATCHER_HEADER* hdr); BOOLEAN KiDispatcherObjectWake(DISPATCHER_HEADER* hdr);
VOID STDCALL KeExpireTimers(PKDPC Apc, VOID STDCALL KeExpireTimers(PKDPC Apc,
PVOID Arg1, PVOID Arg1,
PVOID Arg2, PVOID Arg2,
@ -81,7 +81,9 @@ VOID KeInitializeDispatcherHeader(DISPATCHER_HEADER* Header, ULONG Type,
ULONG Size, ULONG SignalState); ULONG Size, ULONG SignalState);
VOID KeDumpStackFrames(PULONG Frame); VOID KeDumpStackFrames(PULONG Frame);
BOOLEAN KiTestAlert(VOID); BOOLEAN KiTestAlert(VOID);
VOID KeRemoveAllWaitsThread(struct _ETHREAD* Thread, NTSTATUS WaitStatus, BOOL Unblock);
BOOLEAN KiAbortWaitThread(struct _KTHREAD* Thread, NTSTATUS WaitStatus);
PULONG KeGetStackTopThread(struct _ETHREAD* Thread); PULONG KeGetStackTopThread(struct _ETHREAD* Thread);
VOID KeContextToTrapFrame(PCONTEXT Context, PKTRAP_FRAME TrapFrame); VOID KeContextToTrapFrame(PCONTEXT Context, PKTRAP_FRAME TrapFrame);
VOID STDCALL KiDeliverApc(KPROCESSOR_MODE PreviousMode, VOID STDCALL KiDeliverApc(KPROCESSOR_MODE PreviousMode,

View file

@ -1,4 +1,4 @@
/* $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 * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -41,14 +41,22 @@ KiSystemCallHook(ULONG Nr, ...)
VOID VOID
KiAfterSystemCallHook(PKTRAP_FRAME TrapFrame) KiAfterSystemCallHook(PKTRAP_FRAME TrapFrame)
{ {
if (KeGetCurrentThread()->Alerted[1] != 0 && TrapFrame->Cs != KERNEL_CS) KIRQL oldIrql;
{
KiDeliverApc(KernelMode, NULL, NULL); /* If we are returning to umode, deliver one pending umode apc.
} * Note that kmode apcs are also delivered, even if deliverymode is UserMode.
if (KeGetCurrentThread()->Alerted[0] != 0 && TrapFrame->Cs != KERNEL_CS) * 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); KiDeliverApc(UserMode, NULL, TrapFrame);
KeLowerIrql(oldIrql);
} }
} }

View file

@ -1,4 +1,4 @@
/* $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 * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -133,6 +133,7 @@ PsTerminateCurrentThread(NTSTATUS ExitStatus)
DPRINT("terminating %x\n",CurrentThread); DPRINT("terminating %x\n",CurrentThread);
CurrentThread->HasTerminated = TRUE;
CurrentThread->ExitStatus = ExitStatus; CurrentThread->ExitStatus = ExitStatus;
KeQuerySystemTime((PLARGE_INTEGER)&CurrentThread->ExitTime); KeQuerySystemTime((PLARGE_INTEGER)&CurrentThread->ExitTime);
KeCancelTimer(&CurrentThread->Tcb.Timer); KeCancelTimer(&CurrentThread->Tcb.Timer);
@ -192,7 +193,7 @@ PsTerminateCurrentThread(NTSTATUS ExitStatus)
oldIrql = KeAcquireDispatcherDatabaseLock(); oldIrql = KeAcquireDispatcherDatabaseLock();
CurrentThread->Tcb.DispatcherHeader.SignalState = TRUE; CurrentThread->Tcb.DispatcherHeader.SignalState = TRUE;
KeDispatcherObjectWake(&CurrentThread->Tcb.DispatcherHeader); KiDispatcherObjectWake(&CurrentThread->Tcb.DispatcherHeader);
KeReleaseDispatcherDatabaseLock (oldIrql); KeReleaseDispatcherDatabaseLock (oldIrql);
/* The last thread shall close the door on exit */ /* The last thread shall close the door on exit */
@ -211,7 +212,8 @@ PsTerminateCurrentThread(NTSTATUS ExitStatus)
#ifdef _ENABLE_THRDEVTPAIR #ifdef _ENABLE_THRDEVTPAIR
ExpSwapThreadEventPair(CurrentThread, NULL); /* Release the associated eventpair object, if there was one */ ExpSwapThreadEventPair(CurrentThread, NULL); /* Release the associated eventpair object, if there was one */
#endif /* _ENABLE_THRDEVTPAIR */ #endif /* _ENABLE_THRDEVTPAIR */
KeRemoveAllWaitsThread (CurrentThread, STATUS_UNSUCCESSFUL, FALSE);
ASSERT(CurrentThread->Tcb.WaitBlockList == NULL);
PsDispatchThreadNoLock(THREAD_STATE_TERMINATED_1); PsDispatchThreadNoLock(THREAD_STATE_TERMINATED_1);
DPRINT1("Unexpected return, CurrentThread %x PsGetCurrentThread() %x\n", CurrentThread, PsGetCurrentThread()); DPRINT1("Unexpected return, CurrentThread %x PsGetCurrentThread() %x\n", CurrentThread, PsGetCurrentThread());
@ -251,7 +253,7 @@ PsTerminateOtherThread(PETHREAD Thread,
*/ */
{ {
PKAPC Apc; PKAPC Apc;
NTSTATUS Status; KIRQL OldIrql;
DPRINT("PsTerminateOtherThread(Thread %x, ExitStatus %x)\n", DPRINT("PsTerminateOtherThread(Thread %x, ExitStatus %x)\n",
Thread, ExitStatus); Thread, ExitStatus);
@ -271,12 +273,14 @@ PsTerminateOtherThread(PETHREAD Thread,
NULL, NULL,
NULL, NULL,
IO_NO_INCREMENT); IO_NO_INCREMENT);
OldIrql = KeAcquireDispatcherDatabaseLock();
if (THREAD_STATE_BLOCKED == Thread->Tcb.State && UserMode == Thread->Tcb.WaitMode) if (THREAD_STATE_BLOCKED == Thread->Tcb.State && UserMode == Thread->Tcb.WaitMode)
{ {
DPRINT("Unblocking thread\n"); DPRINT("Unblocking thread\n");
Status = STATUS_THREAD_IS_TERMINATING; KiAbortWaitThread((PKTHREAD)Thread, STATUS_THREAD_IS_TERMINATING);
KeRemoveAllWaitsThread(Thread, Status, TRUE);
} }
KeReleaseDispatcherDatabaseLock(OldIrql);
} }
NTSTATUS STDCALL NTSTATUS STDCALL
@ -310,7 +314,7 @@ PiTerminateProcess(PEPROCESS Process,
} }
OldIrql = KeAcquireDispatcherDatabaseLock (); OldIrql = KeAcquireDispatcherDatabaseLock ();
Process->Pcb.DispatcherHeader.SignalState = TRUE; Process->Pcb.DispatcherHeader.SignalState = TRUE;
KeDispatcherObjectWake(&Process->Pcb.DispatcherHeader); KiDispatcherObjectWake(&Process->Pcb.DispatcherHeader);
KeReleaseDispatcherDatabaseLock (OldIrql); KeReleaseDispatcherDatabaseLock (OldIrql);
ObDereferenceObject(Process); ObDereferenceObject(Process);
return(STATUS_SUCCESS); return(STATUS_SUCCESS);