VirtualBox

Changeset 22113 in vbox


Ignore:
Timestamp:
Aug 9, 2009 10:36:25 PM (15 years ago)
Author:
vboxsync
Message:

RTDbgAs: More bugfixes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/dbg/dbgas.cpp

    r22111 r22113  
    6868    /** Pointer to the next module with an identical name. */
    6969    PRTDBGASMOD         pNextName;
     70    /** The index into RTDBGASINT::papModules. */
     71    uint32_t            iOrdinal;
    7072} RTDBGASMOD;
    7173
     
    112114    /** Pointer to the module table.
    113115     * The valid array length is given by cModules. */
    114     PRTDBGASMOD         paModules;
     116    PRTDBGASMOD        *papModules;
    115117    /** AVL tree translating module handles to module entries. */
    116118    AVLPVTREE           ModTree;
     
    209211    pDbgAs->hLock       = NIL_RTSEMRW;
    210212    pDbgAs->cModules    = 0;
    211     pDbgAs->paModules   = NULL;
     213    pDbgAs->papModules  = NULL;
    212214    pDbgAs->ModTree     = NULL;
    213215    pDbgAs->MapTree     = NULL;
     
    332334    while (i-- > 0)
    333335    {
    334         RTDbgModRelease((RTDBGMOD)pDbgAs->paModules[i].Core.Key);
    335         pDbgAs->paModules[i].Core.Key = NIL_RTDBGMOD;
    336     }
    337     RTMemFree(pDbgAs->paModules);
    338     pDbgAs->paModules = NULL;
     336        PRTDBGASMOD pMod = pDbgAs->papModules[i];
     337        AssertPtr(pMod);
     338        if (VALID_PTR(pMod))
     339        {
     340            Assert(pMod->iOrdinal == i);
     341            RTDbgModRelease((RTDBGMOD)pMod->Core.Key);
     342            pMod->Core.Key = NIL_RTDBGMOD;
     343            pMod->iOrdinal = UINT32_MAX;
     344            RTMemFree(pMod);
     345        }
     346        pDbgAs->papModules[i] = NULL;
     347    }
     348    RTMemFree(pDbgAs->papModules);
     349    pDbgAs->papModules = NULL;
    339350
    340351    RTMemFree(pDbgAs);
     
    521532        if (!(pDbgAs->cModules % 32))
    522533        {
    523             void *pvNew = RTMemRealloc(pDbgAs->paModules, sizeof(pDbgAs->paModules[0]) * (pDbgAs->cModules + 32));
     534            void *pvNew = RTMemRealloc(pDbgAs->papModules, sizeof(pDbgAs->papModules[0]) * (pDbgAs->cModules + 32));
    524535            if (!pvNew)
    525536                return VERR_NO_MEMORY;
    526             pDbgAs->paModules = (PRTDBGASMOD)pvNew;
    527 
    528             /** @todo this rebuilding of the tree gets a bit silly... */
    529             pDbgAs->ModTree = NULL;
    530             for (uint32_t iMod = 0; iMod < pDbgAs->cModules; iMod++)
    531             {
    532                 bool fRc = RTAvlPVInsert(&pDbgAs->ModTree, &pDbgAs->paModules[iMod].Core);
    533                 Assert(fRc); NOREF(fRc);
    534             }
     537            pDbgAs->papModules = (PRTDBGASMOD *)pvNew;
    535538        }
    536         pMod = &pDbgAs->paModules[pDbgAs->cModules];
    537         pDbgAs->cModules++;
    538 
     539        pMod = (PRTDBGASMOD)RTMemAlloc(sizeof(*pMod));
     540        if (!pMod)
     541            return VERR_NO_MEMORY;
    539542        pMod->Core.Key  = hDbgMod;
    540543        pMod->pMapHead  = NULL;
    541544        pMod->pNextName = NULL;
    542         if (!RTAvlPVInsert(&pDbgAs->ModTree, &pMod->Core))
     545        if (RT_UNLIKELY(!RTAvlPVInsert(&pDbgAs->ModTree, &pMod->Core)))
    543546        {
    544547            AssertFailed();
    545548            pDbgAs->cModules--;
     549            RTMemFree(pMod);
    546550            return VERR_INTERNAL_ERROR;
    547551        }
     552        pMod->iOrdinal = pDbgAs->cModules;
     553        pDbgAs->papModules[pDbgAs->cModules] = pMod;
     554        pDbgAs->cModules++;
    548555        RTDbgModRetain(hDbgMod);
    549556
     
    558565            if (!pName)
    559566            {
     567                RTDbgModRelease(hDbgMod);
    560568                pDbgAs->cModules--;
    561569                RTAvlPVRemove(&pDbgAs->ModTree, hDbgMod);
    562                 RTDbgModRelease(hDbgMod);
     570                RTMemFree(pMod);
    563571                return VERR_NO_MEMORY;
    564572            }
     
    759767     * Remove it from the module table by replacing it by the last entry.
    760768     */
    761     uint32_t iMod = pMod - &pDbgAs->paModules[0];
    762     Assert(iMod < pDbgAs->cModules);
    763769    pDbgAs->cModules--;
    764     if (iMod <= pDbgAs->cModules)
    765     {
    766         pNode = RTAvlPVRemove(&pDbgAs->ModTree, pDbgAs->paModules[pDbgAs->cModules].Core.Key);
    767         Assert(pNode);
    768         pDbgAs->paModules[iMod] = pDbgAs->paModules[pDbgAs->cModules];
    769         bool fRc = RTAvlPVInsert(&pDbgAs->ModTree, &pMod->Core);
    770         Assert(fRc); NOREF(fRc);
    771     }
     770    uint32_t iMod = pMod->iOrdinal;
     771    Assert(iMod <= pDbgAs->cModules);
     772    if (iMod != pDbgAs->cModules)
     773    {
     774        PRTDBGASMOD pTailMod = pDbgAs->papModules[pDbgAs->cModules];
     775        pTailMod->iOrdinal = iMod;
     776        pDbgAs->papModules[iMod] = pTailMod;
     777    }
     778    pMod->iOrdinal = UINT32_MAX;
     779
     780    /*
     781     * Free it.
     782     */
     783    RTMemFree(pMod);
    772784}
    773785
     
    789801    /* unlink */
    790802    PRTDBGASMOD pMod = pMap->pMod;
    791     if (pMod->pMapHead)
     803    if (pMod->pMapHead == pMap)
    792804        pMod->pMapHead = pMap->pNext;
    793805    else
     
    942954     * Get, retain and return it.
    943955     */
    944     RTDBGMOD hMod = (RTDBGMOD)pDbgAs->paModules[iModule].Core.Key;
     956    RTDBGMOD hMod = (RTDBGMOD)pDbgAs->papModules[iModule]->Core.Key;
    945957    RTDbgModRetain(hMod);
    946958
     
    13211333
    13221334    uint32_t iMod = *pcModules = pDbgAs->cModules;
    1323     PRTDBGMOD paModules = (PRTDBGMOD)RTMemTmpAlloc(sizeof(paModules[0]) * RT_MAX(iMod, 1));
    1324     if (paModules)
     1335    PRTDBGMOD pahModules = (PRTDBGMOD)RTMemTmpAlloc(sizeof(pahModules[0]) * RT_MAX(iMod, 1));
     1336    if (pahModules)
    13251337    {
    13261338        while (iMod-- > 0)
    13271339        {
    1328             RTDBGMOD hMod = (RTDBGMOD)pDbgAs->paModules[iMod].Core.Key;
    1329             paModules[iMod] = hMod;
     1340            RTDBGMOD hMod = (RTDBGMOD)pDbgAs->papModules[iMod]->Core.Key;
     1341            pahModules[iMod] = hMod;
    13301342            RTDbgModRetain(hMod);
    13311343        }
     
    13331345
    13341346    RTDBGAS_UNLOCK_READ(pDbgAs);
    1335     return paModules;
     1347    return pahModules;
    13361348}
    13371349
     
    14481460     */
    14491461    uint32_t cModules;
    1450     PRTDBGMOD paModules = rtDbgAsSnapshotModuleTable(pDbgAs, &cModules);
    1451     if (!paModules)
     1462    PRTDBGMOD pahModules = rtDbgAsSnapshotModuleTable(pDbgAs, &cModules);
     1463    if (!pahModules)
    14521464        return VERR_NO_TMP_MEMORY;
    14531465
     
    14551467    {
    14561468        if (    cchModPat == 0
    1457             ||  RTStrSimplePatternNMatch(pachModPat, cchModPat, RTDbgModName(paModules[i]), RTSTR_MAX))
     1469            ||  RTStrSimplePatternNMatch(pachModPat, cchModPat, RTDbgModName(pahModules[i]), RTSTR_MAX))
    14581470        {
    1459             int rc = RTDbgModSymbolByName(paModules[i], pszSymbol, pSymbol);
     1471            int rc = RTDbgModSymbolByName(pahModules[i], pszSymbol, pSymbol);
    14601472            if (RT_SUCCESS(rc))
    14611473            {
    1462                 if (rtDbgAsFindMappingAndAdjustSymbolValue(pDbgAs, paModules[i], pSymbol))
     1474                if (rtDbgAsFindMappingAndAdjustSymbolValue(pDbgAs, pahModules[i], pSymbol))
    14631475                {
    14641476                    if (phMod)
    1465                         RTDbgModRetain(*phMod = paModules[i]);
     1477                        RTDbgModRetain(*phMod = pahModules[i]);
    14661478                    for (; i < cModules; i++)
    1467                         RTDbgModRelease(paModules[i]);
    1468                     RTMemTmpFree(paModules);
     1479                        RTDbgModRelease(pahModules[i]);
     1480                    RTMemTmpFree(pahModules);
    14691481                    return rc;
    14701482                }
    14711483            }
    14721484        }
    1473         RTDbgModRelease(paModules[i]);
    1474     }
    1475 
    1476     RTMemTmpFree(paModules);
     1485        RTDbgModRelease(pahModules[i]);
     1486    }
     1487
     1488    RTMemTmpFree(pahModules);
    14771489    return VERR_SYMBOL_NOT_FOUND;
    14781490}
     
    15231535     */
    15241536    uint32_t cModules;
    1525     PRTDBGMOD paModules = rtDbgAsSnapshotModuleTable(pDbgAs, &cModules);
    1526     if (!paModules)
     1537    PRTDBGMOD pahModules = rtDbgAsSnapshotModuleTable(pDbgAs, &cModules);
     1538    if (!pahModules)
    15271539        return VERR_NO_TMP_MEMORY;
    15281540
     
    15301542    {
    15311543        if (    cchModPat == 0
    1532             ||  RTStrSimplePatternNMatch(pachModPat, cchModPat, RTDbgModName(paModules[i]), RTSTR_MAX))
     1544            ||  RTStrSimplePatternNMatch(pachModPat, cchModPat, RTDbgModName(pahModules[i]), RTSTR_MAX))
    15331545        {
    1534             int rc = RTDbgModSymbolByNameA(paModules[i], pszSymbol, ppSymbol);
     1546            int rc = RTDbgModSymbolByNameA(pahModules[i], pszSymbol, ppSymbol);
    15351547            if (RT_SUCCESS(rc))
    15361548            {
    1537                 if (rtDbgAsFindMappingAndAdjustSymbolValue(pDbgAs, paModules[i], *ppSymbol))
     1549                if (rtDbgAsFindMappingAndAdjustSymbolValue(pDbgAs, pahModules[i], *ppSymbol))
    15381550                {
    15391551                    if (phMod)
    1540                         RTDbgModRetain(*phMod = paModules[i]);
     1552                        RTDbgModRetain(*phMod = pahModules[i]);
    15411553                    for (; i < cModules; i++)
    1542                         RTDbgModRelease(paModules[i]);
    1543                     RTMemTmpFree(paModules);
     1554                        RTDbgModRelease(pahModules[i]);
     1555                    RTMemTmpFree(pahModules);
    15441556                    return rc;
    15451557                }
    15461558            }
    15471559        }
    1548         RTDbgModRelease(paModules[i]);
    1549     }
    1550 
    1551     RTMemTmpFree(paModules);
     1560        RTDbgModRelease(pahModules[i]);
     1561    }
     1562
     1563    RTMemTmpFree(pahModules);
    15521564    return VERR_SYMBOL_NOT_FOUND;
    15531565}
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