VirtualBox

Changeset 46450 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Jun 7, 2013 7:41:24 PM (12 years ago)
Author:
vboxsync
Message:

STAM: Fixed bug in stamR3LookupDestroyTree.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/STAM.cpp

    r46447 r46450  
    11651165{
    11661166    Assert(pRoot); Assert(!pRoot->pParent);
    1167     PSTAMLOOKUP pLookup = pRoot;
     1167    PSTAMLOOKUP pCur = pRoot;
    11681168    for (;;)
    11691169    {
    1170         uint32_t i = pLookup->cChildren;
     1170        uint32_t i = pCur->cChildren;
    11711171        if (i > 0)
    11721172        {
     
    11741174             * Push child (with leaf optimization).
    11751175             */
    1176             PSTAMLOOKUP pChild = pLookup->papChildren[--i];
     1176            PSTAMLOOKUP pChild = pCur->papChildren[--i];
    11771177            if (pChild->cChildren != 0)
    1178                 pLookup = pChild;
     1178                pCur = pChild;
    11791179            else
    11801180            {
     
    11881188                    }
    11891189                    RTMemFree(pChild);
     1190                    pCur->papChildren[i] = NULL;
    11901191
    11911192                    /* next */
    11921193                    if (i == 0)
    11931194                    {
    1194                         pLookup->papChildren = 0;
     1195                        pCur->cChildren = 0;
    11951196                        break;
    11961197                    }
    1197                     pChild = pLookup->papChildren[--i];
     1198                    pChild = pCur->papChildren[--i];
    11981199                    if (pChild->cChildren != 0)
    11991200                    {
    1200                         pLookup->cChildren = i + 1;
    1201                         pLookup = pChild;
     1201                        pCur->cChildren = i + 1;
     1202                        pCur = pChild;
    12021203                        break;
    12031204                    }
     
    12101211             * Pop and free current.
    12111212             */
    1212             Assert(!pLookup->pDesc);
    1213 
    1214             PSTAMLOOKUP pParent = pLookup->pParent;
    1215             RTMemFree(pLookup->papChildren);
    1216             pLookup->papChildren = NULL;
    1217             RTMemFree(pLookup);
    1218 
    1219             pLookup = pParent;
    1220             if (!pLookup)
     1213            Assert(!pCur->pDesc);
     1214
     1215            PSTAMLOOKUP pParent = pCur->pParent;
     1216            Assert(pCur->iParent == (pParent ? pParent->cChildren - 1 : UINT16_MAX));
     1217
     1218            RTMemFree(pCur->papChildren);
     1219            pCur->papChildren = NULL;
     1220            RTMemFree(pCur);
     1221
     1222            pCur = pParent;
     1223            if (!pCur)
    12211224                break;
    1222             pLookup->cChildren--;
     1225            pCur->papChildren[--pCur->cChildren] = NULL;
    12231226        }
    12241227    }
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette