Author: sginsberg Date: Tue Mar 20 13:39:25 2012 New Revision: 56194
URL: http://svn.reactos.org/svn/reactos?rev=56194&view=rev Log: [NTOS] - As a side effect to 45140 one of the "non-used debug features", breaking in with WinDbg, would no longer work. Add this back, as well as the DPC timeout debug check and support for skipping ticks.
Modified: trunk/reactos/ntoskrnl/ke/time.c
Modified: trunk/reactos/ntoskrnl/ke/time.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/time.c?rev=5619... ============================================================================== --- trunk/reactos/ntoskrnl/ke/time.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ke/time.c [iso-8859-1] Tue Mar 20 13:39:25 2012 @@ -69,6 +69,17 @@ ULARGE_INTEGER CurrentTime, InterruptTime; LONG OldTickOffset;
+ /* Check if this tick is being skipped */ + if (Prcb->SkipTick) + { + /* Handle it next time */ + Prcb->SkipTick = FALSE; + + /* Increase interrupt count and end the interrupt */ + Prcb->InterruptCount++; + KiEndInterrupt(Irql, TrapFrame); + } + /* Add the increment time to the shared data */ InterruptTime.QuadPart = *(ULONGLONG*)&SharedUserData->InterruptTime; InterruptTime.QuadPart += Increment; @@ -80,6 +91,13 @@ /* Update the tick offset */ OldTickOffset = InterlockedExchangeAdd(&KiTickOffset, -(LONG)Increment);
+ /* If the debugger is enabled, check for break-in request */ + if (KdDebuggerEnabled && KdPollBreakIn()) + { + /* Break-in requested! */ + DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C); + } + /* Check for full tick */ if (OldTickOffset <= (LONG)Increment) { @@ -121,6 +139,14 @@ { PKTHREAD Thread = KeGetCurrentThread(); PKPRCB Prcb = KeGetCurrentPrcb(); + + /* Check if this tick is being skipped */ + if (Prcb->SkipTick) + { + /* Handle it next time */ + Prcb->SkipTick = FALSE; + return; + }
/* Increase interrupt count */ Prcb->InterruptCount++; @@ -154,6 +180,24 @@ { /* Handle being in a DPC */ Prcb->DpcTime++; + +#if DBG + /* Update the DPC time */ + Prcb->DebugDpcTime++; + + /* Check if we have timed out */ + if (Prcb->DebugDpcTime == KiDPCTimeout); + { + /* We did! */ + DbgPrint("*** DPC routine > 1 sec --- This is not a break in KeUpdateSystemTime\n"); + + /* Break if debugger is enabled */ + if (KdDebuggerEnabled) DbgBreakPoint(); + + /* Clear state */ + Prcb->DebugDpcTime = 0; + } +#endif } }