KiReduceByEffectiveIdleSmtSet
UINT8 __stdcall KiReduceByEffectiveIdleSmtSet(_KPRCB *CurrentPrcb, UINT64 *IdleCandidateSet){
unsigned __int64 v3;
_ETHREAD *CurrentThread;
unsigned int CurrentRunTime;
unsigned int ExpectedRunTime;
v3 = CurrentPrcb->CoreProcessorSet & ~CurrentPrcb->GroupSetMember;
if( (v3 & *IdleCandidateSet) == 0
|| (CurrentPrcb->ParentNode->IdleCpuSet & v3 & *IdleCandidateSet) != v3
|| (CurrentPrcb->DpcRequestSummary & 1) != 0
|| CurrentPrcb->ReadySummary )
{
return 0;
}
CurrentThread = CurrentPrcb->CurrentThread;
if( !CurrentPrcb->NestingLevel )
{
_disable();
KiUpdateTotalCyclesCurrentThread(CurrentPrcb, &CurrentPrcb->CurrentThread->Tcb, 0i64);
_enable();
}
CurrentRunTime = CurrentThread->Tcb.CurrentRunTime;
ExpectedRunTime = CurrentThread->Tcb.ExpectedRunTime;
if( CurrentRunTime < ExpectedRunTime && ExpectedRunTime - CurrentRunTime >= KiShortExecutionCycles )
return 0;
*IdleCandidateSet &= v3;
return 1;
}Referenced by:
KiChooseTargetProcessor
KiSelectIdleProcessor
KiTryLocalThreadSchedule