ViDeadlockForgetResourceHistory
VOID __stdcall ViDeadlockForgetResourceHistory(
_VI_DEADLOCK_RESOURCE *Resource,
UINT64 TrimThreshold,
UINT64 AgeThreshold,
VOID **NodesToFree){
int v4;
int v7;
_LIST_ENTRY *p_ResourceList;
_LIST_ENTRY *Flink;
unsigned int v10;
_VI_DEADLOCK_NODE *p_Blink;
unsigned int v12;
_LIST_ENTRY *v13;
_VI_DEADLOCK_NODE *v14;
v4 = 0;
v7 = 0;
if( Resource->ThreadOwner || (unsigned __int16)*((_DWORD *)Resource + 1) < 0x100u )
return;
p_ResourceList = &Resource->ResourceList;
Flink = Resource->ResourceList.Flink;
v10 = *((_DWORD *)ViDeadlockGlobals + 8201);
while( Flink != p_ResourceList )
{
p_Blink = (_VI_DEADLOCK_NODE *)&Flink[-3].Blink;
Flink = Flink->Flink;
v12 = p_Blink->u1.Whole >> 3;
if( v10 <= v12 )
{
if( v12 - v10 < 0x2000 )
goto LABEL_8;
}
else if( v10 - v12 > 0x2000 )
{
LABEL_8:
ViDeadlockRemoveNode(p_Blink, 0i64);
++v7;
p_Blink->Parent = (_VI_DEADLOCK_NODE *)*NodesToFree;
*NodesToFree = p_Blink;
}
}
*((_DWORD *)ViDeadlockGlobals + 8197) += v7;
if( (unsigned __int16)*((_DWORD *)Resource + 1) >= 0x100u )
{
v13 = p_ResourceList->Flink;
while( v13 != p_ResourceList && (unsigned __int16)*((_DWORD *)Resource + 1) >= 0x100u )
{
v14 = (_VI_DEADLOCK_NODE *)&v13[-3].Blink;
v13 = v13->Flink;
ViDeadlockRemoveNode(v14, 0i64);
++v4;
v14->Parent = (_VI_DEADLOCK_NODE *)*NodesToFree;
*NodesToFree = v14;
}
*((_DWORD *)ViDeadlockGlobals + 8198) += v4;
}
}Referenced by:
ViDeadlockTrimResources