KiRecomputeGroupSchedulingRank
VOID __stdcall KiRecomputeGroupSchedulingRank(_KSCHEDULING_GROUP *SchedulingGroup, _KSCB *Scb, _KPRCB *Prcb){
unsigned __int64 v6;
volatile signed __int32 *ShareRank;
unsigned __int64 v8;
unsigned __int64 RankCycleTarget;
unsigned __int64 v10;
unsigned __int64 v11;
volatile signed __int32 *v12;
KiChargeSchedulingGroupCycleTime(SchedulingGroup, Scb);
v6 = KiCycleDivisorShortTerm * SchedulingGroup->RelativeWeight;
++Scb->Rank;
ShareRank = (volatile signed __int32 *)Scb->ShareRank;
v8 = v6 >> 7;
Scb->RankCycleTarget += v8;
RankCycleTarget = Scb->RankCycleTarget;
if( ShareRank )
{
_InterlockedIncrement(ShareRank);
RankCycleTarget = Scb->RankCycleTarget;
}
if( Scb->GenerationCycles > RankCycleTarget )
{
v11 = v8 + Scb->GenerationCycles - RankCycleTarget - 1;
v10 = v11 / v8;
Scb->Rank += v11 / v8;
Scb->RankCycleTarget = RankCycleTarget + v8 * (unsigned int)(v11 / v8);
v12 = (volatile signed __int32 *)Scb->ShareRank;
if( v12 )
_InterlockedExchangeAdd(v12, v10);
}
if( (*((_BYTE *)Scb + 112) & 1) != 0 )
KiResortScbQueue(Prcb, Scb, 1u);
}Referenced by:
KiGroupSchedulingQuantumEnd
KiQueueReadyThread
KiSwapThread