VirtualBox

Changeset 97930 in vbox


Ignore:
Timestamp:
Dec 31, 2022 3:33:06 AM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
155020
Message:

Add/VBoxGuestR0LibPhysHeap.cpp: Simplify link handling by adding an array access to the free and alloc block lists. Also, set the mutex handle to NIL after destruction.

Location:
trunk/src/VBox/Additions/common/VBoxGuest/lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibInternal.h

    r97921 r97930  
    133133     */
    134134    RTSEMFASTMUTEX     mutexHeap;
    135     VBGLPHYSHEAPBLOCK *pFreeBlocksHead;
    136     VBGLPHYSHEAPBLOCK *pAllocBlocksHead;
     135    /** Block list heads. */
     136    union
     137    {
     138        struct
     139        {
     140            VBGLPHYSHEAPBLOCK *pFreeBlocksHead;
     141            VBGLPHYSHEAPBLOCK *pAllocBlocksHead;
     142        } s;
     143        /** Indexed by VBGLPHYSHEAPBLOCK::fAllocated, so zero is the free ones
     144         * and one the allocated ones. */
     145        VBGLPHYSHEAPBLOCK *apHeads[2];
     146    } u;
    137147    /** Indexed by VBGLPHYSHEAPBLOCK::fAllocated, so zero is the free ones and
    138      *  one the allocated ones. */
     148     * one the allocated ones. */
    139149    int32_t            acBlocks[2];
     150    /** Chunk    */
    140151    VBGLPHYSHEAPCHUNK *pChunkHead;
    141152    /** @} */
  • trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibPhysHeap.cpp

    r97929 r97930  
    4444 * The physical memory heap consists of a doubly linked list of large chunks
    4545 * (VBGLDATA::pChunkHead), memory blocks are allocated within these chunks and
    46  * are members of allocated (VBGLDATA::pAllocBlocksHead) and free
    47  * (VBGLDATA::pFreeBlocksHead) doubly linked lists.
     46 * are members of allocated (VBGLDATA::u.s.pAllocBlocksHead) and free
     47 * (VBGLDATA::u.s.pFreeBlocksHead) doubly linked lists.
    4848 *
    4949 * When allocating a block, we search the free list for a suitable free block.
     
    221221   VBGL_PH_dprintf(("Allocated blocks:\n"));
    222222
    223    VBGLPHYSHEAPBLOCK *pBlock = g_vbgldata.pAllocBlocksHead;
     223   VBGLPHYSHEAPBLOCK *pBlock = g_vbgldata.u.s.pAllocBlocksHead;
    224224
    225225   while (pBlock)
     
    234234   VBGL_PH_dprintf(("Free blocks:\n"));
    235235
    236    pBlock = g_vbgldata.pFreeBlocksHead;
     236   pBlock = g_vbgldata.u.s.pFreeBlocksHead;
    237237
    238238   while (pBlock)
     
    290290    {
    291291        /* inserting to head of list */
     292        VBGLPHYSHEAPBLOCK *pOldHead = g_vbgldata.u.apHeads[fAllocated];
     293
     294        pBlock->pNext = pOldHead;
    292295        pBlock->pPrev = NULL;
    293296
    294         if (fAllocated)
    295         {
    296             pBlock->pNext = g_vbgldata.pAllocBlocksHead;
    297 
    298             if (g_vbgldata.pAllocBlocksHead)
    299                 g_vbgldata.pAllocBlocksHead->pPrev = pBlock;
    300 
    301             g_vbgldata.pAllocBlocksHead = pBlock;
    302         }
    303         else
    304         {
    305             pBlock->pNext = g_vbgldata.pFreeBlocksHead;
    306 
    307             if (g_vbgldata.pFreeBlocksHead)
    308                 g_vbgldata.pFreeBlocksHead->pPrev = pBlock;
    309 
    310             g_vbgldata.pFreeBlocksHead = pBlock;
    311         }
     297        if (pOldHead)
     298            pOldHead->pPrev = pBlock;
     299        g_vbgldata.u.apHeads[fAllocated] = pBlock;
    312300    }
    313301
     
    331319    bool const fAllocated = pBlock->fAllocated;
    332320
    333     if (pBlock->pNext)
    334         pBlock->pNext->pPrev = pBlock->pPrev;
     321    VBGLPHYSHEAPBLOCK *pOtherBlock = pBlock->pNext;
     322    if (pOtherBlock)
     323        pOtherBlock->pPrev = pBlock->pPrev;
    335324    /* else: this is tail of list but we do not maintain tails of block lists. so nothing to do. */
    336325
    337     if (pBlock->pPrev)
    338         pBlock->pPrev->pNext = pBlock->pNext;
    339     else if (fAllocated)
    340     {
    341         Assert(g_vbgldata.pAllocBlocksHead == pBlock);
    342         g_vbgldata.pAllocBlocksHead = pBlock->pNext;
    343     }
     326    pOtherBlock = pBlock->pPrev;
     327    if (pOtherBlock)
     328        pOtherBlock->pNext = pBlock->pNext;
    344329    else
    345330    {
    346         Assert(g_vbgldata.pFreeBlocksHead == pBlock);
    347         g_vbgldata.pFreeBlocksHead = pBlock->pNext;
     331        Assert(g_vbgldata.u.apHeads[fAllocated] == pBlock);
     332        g_vbgldata.u.apHeads[fAllocated] = pBlock->pNext;
    348333    }
    349334
     
    536521           so HGCM processing in VMMDev can use page locks instead of several reads and writes. */
    537522        VBGLPHYSHEAPBLOCK *pFallback = NULL;
    538         for (pIter = g_vbgldata.pFreeBlocksHead; pIter != NULL; pIter = pIter->pNext, cLeft--)
     523        for (pIter = g_vbgldata.u.s.pFreeBlocksHead; pIter != NULL; pIter = pIter->pNext, cLeft--)
    539524        {
    540525            AssertBreak(pIter->u32Signature == VBGL_PH_BLOCKSIGNATURE);
     
    581566    {
    582567        /* Large than 3/4 page:  Find closest free list match. */
    583         for (pIter = g_vbgldata.pFreeBlocksHead; pIter != NULL; pIter = pIter->pNext, cLeft--)
     568        for (pIter = g_vbgldata.u.s.pFreeBlocksHead; pIter != NULL; pIter = pIter->pNext, cLeft--)
    584569        {
    585570            AssertBreak(pIter->u32Signature == VBGL_PH_BLOCKSIGNATURE);
     
    834819
    835820    size_t cbTotal = 0;
    836     for (VBGLPHYSHEAPBLOCK *pCurBlock = g_vbgldata.pFreeBlocksHead; pCurBlock; pCurBlock = pCurBlock->pNext)
     821    for (VBGLPHYSHEAPBLOCK *pCurBlock = g_vbgldata.u.s.pFreeBlocksHead; pCurBlock; pCurBlock = pCurBlock->pNext)
    837822    {
    838823        Assert(pCurBlock->u32Signature == VBGL_PH_BLOCKSIGNATURE);
     
    915900     * Count each list and check that they contain the same number of nodes.
    916901     */
    917     VBGLPHYSHEAPBLOCK *apHeads[2] = { g_vbgldata.pFreeBlocksHead, g_vbgldata.pAllocBlocksHead };
    918     for (unsigned iType = 0; iType < RT_ELEMENTS(apHeads); iType++)
     902    for (unsigned iType = 0; iType < RT_ELEMENTS(g_vbgldata.u.apHeads); iType++)
    919903    {
    920904        unsigned           cBlocks    = 0;
    921905        VBGLPHYSHEAPBLOCK *pPrevBlock = NULL;
    922         for (VBGLPHYSHEAPBLOCK *pCurBlock = apHeads[iType]; pCurBlock; pCurBlock = pCurBlock->pNext)
     906        for (VBGLPHYSHEAPBLOCK *pCurBlock = g_vbgldata.u.apHeads[iType]; pCurBlock; pCurBlock = pCurBlock->pNext)
    923907        {
    924908            AssertReturn(pCurBlock->u32Signature == VBGL_PH_BLOCKSIGNATURE,
     
    980964
    981965    RTSemFastMutexDestroy(g_vbgldata.mutexHeap);
    982 }
    983 
     966    g_vbgldata.mutexHeap = NIL_RTSEMFASTMUTEX;
     967}
     968
Note: See TracChangeset for help on using the changeset viewer.

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