ViDeadlockMergeNodes
VOID __stdcall ViDeadlockMergeNodes(_VI_DEADLOCK_NODE *NodeTo, _VI_DEADLOCK_NODE *NodeFrom, VOID **NodesToFree){
_VI_DEADLOCK_THREAD *ThreadEntry;
_VI_DEADLOCK_NODE *v5;
_LIST_ENTRY *p_ChildrenList;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v8;
_LIST_ENTRY **p_Blink;
_LIST_ENTRY *v10;
_LIST_ENTRY *Blink;
_VI_DEADLOCK_NODE *v12;
_LIST_ENTRY *v13;
_LIST_ENTRY *v14;
_LIST_ENTRY *v15;
_LIST_ENTRY *v16;
_LIST_ENTRY *v17;
_VI_DEADLOCK_NODE *v18;
ThreadEntry = NodeFrom->ThreadEntry;
v5 = NodeFrom;
if( ThreadEntry )
{
NodeTo->ThreadEntry = ThreadEntry;
*(_OWORD *)NodeTo->StackTrace = *(_OWORD *)NodeFrom->StackTrace;
*(_OWORD *)&NodeTo->StackTrace[2] = *(_OWORD *)&NodeFrom->StackTrace[2];
*(_OWORD *)&NodeTo->StackTrace[4] = *(_OWORD *)&NodeFrom->StackTrace[4];
*(_OWORD *)&NodeTo->StackTrace[6] = *(_OWORD *)&NodeFrom->StackTrace[6];
*(_OWORD *)NodeTo->ParentStackTrace = *(_OWORD *)NodeFrom->ParentStackTrace;
*(_OWORD *)&NodeTo->ParentStackTrace[2] = *(_OWORD *)&NodeFrom->ParentStackTrace[2];
*(_OWORD *)&NodeTo->ParentStackTrace[4] = *(_OWORD *)&NodeFrom->ParentStackTrace[4];
*(_OWORD *)&NodeTo->ParentStackTrace[6] = *(_OWORD *)&NodeFrom->ParentStackTrace[6];
}
if( (NodeFrom->u1.Whole & 1) != 0 )
NodeTo->u1.Whole = NodeFrom->u1.Whole & 1 | NodeTo->u1.Whole & 0xFFFFFFFE;
p_ChildrenList = &NodeFrom->ChildrenList;
Flink = NodeFrom->ChildrenList.Flink;
while( Flink != p_ChildrenList )
{
v8 = Flink->Flink;
p_Blink = &Flink[-2].Blink;
v10 = Flink;
if( Flink->Flink->Blink != Flink )
goto LABEL_18;
Blink = Flink->Blink;
if( Blink->Flink != Flink )
goto LABEL_18;
Blink->Flink = v8;
v8->Blink = Blink;
ViDeadlockUpdateChildrenCount(v5, (unsigned int)~*((_DWORD *)p_Blink + 19));
*p_Blink = (_LIST_ENTRY *)v12;
v13 = v12->ChildrenList.Blink;
if( v13->Flink != &v12->ChildrenList )
goto LABEL_18;
v10->Blink = v13;
v10->Flink = &v12->ChildrenList;
v13->Flink = v10;
v12->ChildrenList.Blink = v10;
ViDeadlockUpdateChildrenCount(v12, (unsigned int)(*((_DWORD *)p_Blink + 19) + 1));
}
if( v5->Parent )
{
v14 = v5->SiblingsList.Flink;
if( v14->Blink != &v5->SiblingsList || (v15 = v5->SiblingsList.Blink, v15->Flink != &v5->SiblingsList) )
LABEL_18:
__fastfail(3u);
v15->Flink = v14;
v14->Blink = v15;
ViDeadlockUpdateChildrenCount(v5->Parent, 0xFFFFFFFFi64);
}
--*((_WORD *)v5->Root + 2);
v16 = v5->ResourceList.Flink;
if( ($40597CAD8088CB40007EECA86A191ECD *)v16->Blink != &v5->40 )
goto LABEL_18;
v17 = v5->ResourceList.Blink;
if( ($40597CAD8088CB40007EECA86A191ECD *)v17->Flink != &v5->40 )
goto LABEL_18;
v18 = (_VI_DEADLOCK_NODE *)*NodesToFree;
v17->Flink = v16;
v16->Blink = v17;
*NodesToFree = v5;
v5->Parent = v18;
}Referenced by:
ViDeadlockCheckDuplicatesAmongChildren
ViDeadlockCheckDuplicatesAmongRoots