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