VirtualBox

Changeset 97940 in vbox for trunk


Ignore:
Timestamp:
Jan 2, 2023 3:26:21 PM (2 years ago)
Author:
vboxsync
Message:

Add/VBoxGuestR0LibPhysHeap.cpp: More cleanups, eliminating unecessary macros and other stuff.

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

Legend:

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

    r97937 r97940  
    134134     * @{
    135135     */
    136     RTSEMFASTMUTEX          mutexHeap;
     136    RTSEMFASTMUTEX          hMtxHeap;
    137137    /** Head of the block list (both free and allocated blocks).
    138138     * This runs parallel to the chunk list and is sorted by address within each
  • trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibPhysHeap.cpp

    r97938 r97940  
    3636 * @ref grp_rt_heap_offset "RTHeapOffset" in IPRT, except that this code handles
    3737 * mutiple chunks and has a physical address associated with each chunk and
    38  * block.
     38 * block.  The alignment is fixed (VBGL_PH_ALLOC_ALIGN).
    3939 *
    4040 * When allocating memory, a free block is found that satisfies the request,
     
    6868*   Defined Constants And Macros                                                                                                 *
    6969*********************************************************************************************************************************/
    70 #define VBGL_PH_ASSERT      Assert
    71 #define VBGL_PH_ASSERT_MSG  AssertMsg
    72 
    73 /*#define DUMPHEAP*/
    74 
    75 #ifdef DUMPHEAP
    76 # define VBGL_PH_dprintf(a) RTAssertMsg2Weak a
     70/** Enables heap dumping. */
     71#if defined(DOXYGEN_RUNNING) || 0
     72# define VBGL_PH_DUMPHEAP
     73#endif
     74
     75#ifdef VBGL_PH_DUMPHEAP
     76# define VBGL_PH_DPRINTF(a)            RTAssertMsg2Weak a
    7777#else
    78 # define VBGL_PH_dprintf(a)
     78# define VBGL_PH_DPRINTF(a)             do { } while (0)
    7979#endif
    8080
    81 /* Heap chunk signature */
     81/** Heap chunk signature */
    8282#define VBGL_PH_CHUNKSIGNATURE          UINT32_C(0xADDCCCCC)
    83 /* Heap chunk allocation unit */
     83/** Heap chunk allocation unit */
    8484#define VBGL_PH_CHUNKSIZE               (0x10000)
    8585
    86 /* Heap block signature */
     86/** Heap block signature */
    8787#define VBGL_PH_BLOCKSIGNATURE          UINT32_C(0xADDBBBBB)
    8888
     
    228228
    229229
    230 #ifndef DUMPHEAP
     230/**
     231 * Debug function that dumps the heap.
     232 */
     233#ifndef VBGL_PH_DUMPHEAP
    231234# define dumpheap(pszWhere) do { } while (0)
    232235#else
    233 void dumpheap(const char *pszWhere)
    234 {
    235    VBGL_PH_dprintf(("VBGL_PH dump at '%s'\n", pszWhere));
    236 
    237    VBGL_PH_dprintf(("Chunks:\n"));
     236static void dumpheap(const char *pszWhere)
     237{
     238   VBGL_PH_DPRINTF(("VBGL_PH dump at '%s'\n", pszWhere));
     239
     240   VBGL_PH_DPRINTF(("Chunks:\n"));
    238241   for (VBGLPHYSHEAPCHUNK *pChunk = g_vbgldata.pChunkHead; pChunk; pChunk = pChunk->pNext)
    239        VBGL_PH_dprintf(("%p: pNext = %p, pPrev = %p, sign = %08X, size = %8d, cBlocks = %8d, cFreeBlocks=%8d, phys = %08X\n",
     242       VBGL_PH_DPRINTF(("%p: pNext = %p, pPrev = %p, sign = %08X, size = %8d, cBlocks = %8d, cFreeBlocks=%8d, phys = %08X\n",
    240243                        pChunk, pChunk->pNext, pChunk->pPrev, pChunk->u32Signature, pChunk->cbChunk,
    241244                        pChunk->cBlocks, pChunk->cFreeBlocks, pChunk->physAddr));
    242245
    243    VBGL_PH_dprintf(("Allocated blocks:\n"));
     246   VBGL_PH_DPRINTF(("Allocated blocks:\n"));
    244247   for (VBGLPHYSHEAPBLOCK *pBlock = g_vbgldata.pBlockHead; pBlock; pBlock = pBlock->pNext)
    245        VBGL_PH_dprintf(("%p: pNext = %p, pPrev = %p, size = %05x, sign = %08X, %s, pChunk = %p\n",
     248       VBGL_PH_DPRINTF(("%p: pNext = %p, pPrev = %p, size = %05x, sign = %08X, %s, pChunk = %p\n",
    246249                        pBlock, pBlock->pNext, pBlock->pPrev, pBlock->cbUser,
    247250                        pBlock->u32Signature,  pBlock->fAllocated ? "allocated" : "     free", pBlock->pChunk));
    248251
    249    VBGL_PH_dprintf(("Free blocks:\n"));
     252   VBGL_PH_DPRINTF(("Free blocks:\n"));
    250253   for (VBGLPHYSHEAPFREEBLOCK *pBlock = g_vbgldata.pFreeHead; pBlock; pBlock = pBlock->pNextFree)
    251        VBGL_PH_dprintf(("%p: pNextFree = %p, pPrevFree = %p, size = %05x, sign = %08X, pChunk = %p%s\n",
     254       VBGL_PH_DPRINTF(("%p: pNextFree = %p, pPrevFree = %p, size = %05x, sign = %08X, pChunk = %p%s\n",
    252255                        pBlock, pBlock->pNextFree, pBlock->pPrevFree, pBlock->Core.cbUser,
    253256                        pBlock->Core.u32Signature, pBlock->Core.pChunk,
    254257                        !pBlock->Core.fAllocated ? "" : " !!allocated-block-on-freelist!!"));
    255258
    256    VBGL_PH_dprintf(("VBGL_PH dump at '%s' done\n", pszWhere));
     259   VBGL_PH_DPRINTF(("VBGL_PH dump at '%s' done\n", pszWhere));
    257260}
    258261#endif
    259262
    260263
     264/**
     265 * Initialize a free block
     266 */
    261267static void vbglPhysHeapInitFreeBlock(VBGLPHYSHEAPFREEBLOCK *pBlock, VBGLPHYSHEAPCHUNK *pChunk, uint32_t cbUser)
    262268{
    263     VBGL_PH_ASSERT(pBlock != NULL);
    264     VBGL_PH_ASSERT(pChunk != NULL);
     269    Assert(pBlock != NULL);
     270    Assert(pChunk != NULL);
    265271
    266272    pBlock->Core.u32Signature = VBGL_PH_BLOCKSIGNATURE;
     
    294300static void vbglPhysHeapInsertBlock(VBGLPHYSHEAPBLOCK *pBlock)
    295301{
    296     VBGL_PH_ASSERT_MSG(pBlock->pNext == NULL, ("pBlock->pNext = %p\n", pBlock->pNext));
    297     VBGL_PH_ASSERT_MSG(pBlock->pPrev == NULL, ("pBlock->pPrev = %p\n", pBlock->pPrev));
     302    AssertMsg(pBlock->pNext == NULL, ("pBlock->pNext = %p\n", pBlock->pNext));
     303    AssertMsg(pBlock->pPrev == NULL, ("pBlock->pPrev = %p\n", pBlock->pPrev));
    298304
    299305    /* inserting to head of list */
     
    319325static void vbglPhysHeapInsertBlockAfter(VBGLPHYSHEAPBLOCK *pBlock, VBGLPHYSHEAPBLOCK *pInsertAfter)
    320326{
    321     VBGL_PH_ASSERT_MSG(pBlock->pNext == NULL, ("pBlock->pNext = %p\n", pBlock->pNext));
    322     VBGL_PH_ASSERT_MSG(pBlock->pPrev == NULL, ("pBlock->pPrev = %p\n", pBlock->pPrev));
     327    AssertMsg(pBlock->pNext == NULL, ("pBlock->pNext = %p\n", pBlock->pNext));
     328    AssertMsg(pBlock->pPrev == NULL, ("pBlock->pPrev = %p\n", pBlock->pPrev));
    323329
    324330    pBlock->pNext = pInsertAfter->pNext;
     
    389395{
    390396    Assert(!pBlock->Core.fAllocated);
    391     VBGL_PH_ASSERT_MSG(pBlock->pNextFree == NULL, ("pBlock->pNextFree = %p\n", pBlock->pNextFree));
    392     VBGL_PH_ASSERT_MSG(pBlock->pPrevFree == NULL, ("pBlock->pPrevFree = %p\n", pBlock->pPrevFree));
     397    AssertMsg(pBlock->pNextFree == NULL, ("pBlock->pNextFree = %p\n", pBlock->pNextFree));
     398    AssertMsg(pBlock->pPrevFree == NULL, ("pBlock->pPrevFree = %p\n", pBlock->pPrevFree));
    393399
    394400    /* inserting to head of list */
     
    418424{
    419425    Assert(!pBlock->Core.fAllocated);
    420     VBGL_PH_ASSERT_MSG(pBlock->pNextFree == NULL, ("pBlock->pNextFree = %p\n", pBlock->pNextFree));
    421     VBGL_PH_ASSERT_MSG(pBlock->pPrevFree == NULL, ("pBlock->pPrevFree = %p\n", pBlock->pPrevFree));
     426    AssertMsg(pBlock->pNextFree == NULL, ("pBlock->pNextFree = %p\n", pBlock->pNextFree));
     427    AssertMsg(pBlock->pPrevFree == NULL, ("pBlock->pPrevFree = %p\n", pBlock->pPrevFree));
    422428
    423429    /* inserting after the tiven node */
     
    483489    VBGLPHYSHEAPCHUNK *pChunk;
    484490    uint32_t           cbChunk;
    485     VBGL_PH_dprintf(("Allocating new chunk for %#x byte allocation\n", cbMinBlock));
     491    VBGL_PH_DPRINTF(("Allocating new chunk for %#x byte allocation\n", cbMinBlock));
    486492    AssertReturn(cbMinBlock <= VBGL_PH_LARGEST_ALLOC_SIZE, NULL); /* paranoia */
    487493
     
    557563        g_vbgldata.pChunkHead    = pChunk;
    558564
    559         VBGL_PH_dprintf(("Allocated chunk %p LB %#x, block %p LB %#x\n", pChunk, cbChunk, pBlock, pBlock->Core.cbUser));
     565        VBGL_PH_DPRINTF(("Allocated chunk %p LB %#x, block %p LB %#x\n", pChunk, cbChunk, pBlock, pBlock->Core.cbUser));
    560566        return pBlock;
    561567    }
     
    570576static void vbglPhysHeapChunkDelete(VBGLPHYSHEAPCHUNK *pChunk)
    571577{
    572     uintptr_t  uEnd, uCur;
    573     VBGL_PH_ASSERT(pChunk != NULL);
    574     VBGL_PH_ASSERT_MSG(pChunk->u32Signature == VBGL_PH_CHUNKSIGNATURE, ("pChunk->u32Signature = %08X\n", pChunk->u32Signature));
    575 
    576     VBGL_PH_dprintf(("Deleting chunk %p size %x\n", pChunk, pChunk->cbChunk));
     578    uintptr_t uEnd, uCur;
     579    Assert(pChunk != NULL);
     580    AssertMsg(pChunk->u32Signature == VBGL_PH_CHUNKSIGNATURE, ("pChunk->u32Signature = %08X\n", pChunk->u32Signature));
     581
     582    VBGL_PH_DPRINTF(("Deleting chunk %p size %x\n", pChunk, pChunk->cbChunk));
    577583
    578584    /*
     
    601607    }
    602608
    603     VBGL_PH_ASSERT_MSG(uCur == uEnd, ("uCur = %p, uEnd = %p, pChunk->cbChunk = %08X\n", uCur, uEnd, pChunk->cbChunk));
     609    AssertMsg(uCur == uEnd, ("uCur = %p, uEnd = %p, pChunk->cbChunk = %08X\n", uCur, uEnd, pChunk->cbChunk));
    604610
    605611    /*
     
    643649    AssertCompile(VBGL_PH_ALLOC_ALIGN <= sizeof(pBlock->Core));
    644650
    645     rc = RTSemFastMutexRequest(g_vbgldata.mutexHeap);
     651    rc = RTSemFastMutexRequest(g_vbgldata.hMtxHeap);
    646652    AssertRCReturn(rc, NULL);
    647653
     
    749755    {
    750756        /* We have a free block, either found or allocated. */
    751         VBGL_PH_ASSERT_MSG(pBlock->Core.u32Signature == VBGL_PH_BLOCKSIGNATURE,
    752                            ("pBlock = %p, pBlock->u32Signature = %08X\n", pBlock, pBlock->Core.u32Signature));
    753         VBGL_PH_ASSERT_MSG(!pBlock->Core.fAllocated, ("pBlock = %p\n", pBlock));
     757        AssertMsg(pBlock->Core.u32Signature == VBGL_PH_BLOCKSIGNATURE,
     758                  ("pBlock = %p, pBlock->u32Signature = %08X\n", pBlock, pBlock->Core.u32Signature));
     759        AssertMsg(!pBlock->Core.fAllocated, ("pBlock = %p\n", pBlock));
    754760
    755761        /*
     
    787793         * Return success.
    788794         */
    789         rc = RTSemFastMutexRelease(g_vbgldata.mutexHeap);
    790 
    791         VBGL_PH_dprintf(("VbglR0PhysHeapAlloc: returns %p size %x\n", pBlock + 1, pBlock->Core.cbUser));
     795        rc = RTSemFastMutexRelease(g_vbgldata.hMtxHeap);
     796
     797        VBGL_PH_DPRINTF(("VbglR0PhysHeapAlloc: returns %p size %x\n", pBlock + 1, pBlock->Core.cbUser));
    792798        return &pBlock->Core + 1;
    793799    }
     
    796802     * Return failure.
    797803     */
    798     rc = RTSemFastMutexRelease(g_vbgldata.mutexHeap);
     804    rc = RTSemFastMutexRelease(g_vbgldata.hMtxHeap);
    799805    AssertRC(rc);
    800806
    801     VBGL_PH_dprintf(("VbglR0PhysHeapAlloc: returns NULL (requested %#x bytes)\n", cb));
     807    VBGL_PH_DPRINTF(("VbglR0PhysHeapAlloc: returns NULL (requested %#x bytes)\n", cb));
    802808    return NULL;
    803809}
     
    837843        VBGLPHYSHEAPFREEBLOCK *pBlock;
    838844
    839         int rc = RTSemFastMutexRequest(g_vbgldata.mutexHeap);
     845        int rc = RTSemFastMutexRequest(g_vbgldata.hMtxHeap);
    840846        AssertRCReturnVoid(rc);
    841847
     
    856862             * Change the block status to freeed.
    857863             */
    858             VBGL_PH_dprintf(("VbglR0PhysHeapFree: %p size %#x\n", pv, pBlock->Core.cbUser));
     864            VBGL_PH_DPRINTF(("VbglR0PhysHeapFree: %p size %#x\n", pv, pBlock->Core.cbUser));
    859865
    860866            pBlock->Core.fAllocated = false;
     
    951957                             pBlock, pBlock->Core.u32Signature, pBlock->Core.cbUser, pBlock->Core.fAllocated));
    952958
    953         rc = RTSemFastMutexRelease(g_vbgldata.mutexHeap);
     959        rc = RTSemFastMutexRelease(g_vbgldata.hMtxHeap);
    954960        AssertRC(rc);
    955961    }
     
    957963
    958964#ifdef IN_TESTCASE /* For the testcase only */
    959 # include <iprt/err.h>
    960965
    961966/**
     
    970975DECLVBGL(size_t) VbglR0PhysHeapGetFreeSize(void)
    971976{
    972     int rc = RTSemFastMutexRequest(g_vbgldata.mutexHeap);
     977    int rc = RTSemFastMutexRequest(g_vbgldata.hMtxHeap);
    973978    AssertRCReturn(rc, 0);
    974979
     
    981986    }
    982987
    983     RTSemFastMutexRelease(g_vbgldata.mutexHeap);
     988    RTSemFastMutexRelease(g_vbgldata.hMtxHeap);
    984989    return cbTotal;
    985990}
     
    11051110DECLVBGL(int) VbglR0PhysHeapCheck(PRTERRINFO pErrInfo)
    11061111{
    1107     int rc = RTSemFastMutexRequest(g_vbgldata.mutexHeap);
     1112    int rc = RTSemFastMutexRequest(g_vbgldata.hMtxHeap);
    11081113    AssertRCReturn(rc, 0);
    11091114
    11101115    rc = vbglR0PhysHeapCheckLocked(pErrInfo);
    11111116
    1112     RTSemFastMutexRelease(g_vbgldata.mutexHeap);
     1117    RTSemFastMutexRelease(g_vbgldata.hMtxHeap);
    11131118    return rc;
    11141119}
     
    11181123DECLR0VBGL(int) VbglR0PhysHeapInit(void)
    11191124{
    1120     g_vbgldata.mutexHeap = NIL_RTSEMFASTMUTEX;
     1125    g_vbgldata.hMtxHeap = NIL_RTSEMFASTMUTEX;
    11211126
    11221127    /* Allocate the first chunk of the heap. */
    11231128    VBGLPHYSHEAPFREEBLOCK *pBlock = vbglPhysHeapChunkAlloc(0);
    11241129    if (pBlock)
    1125         return RTSemFastMutexCreate(&g_vbgldata.mutexHeap);
     1130        return RTSemFastMutexCreate(&g_vbgldata.hMtxHeap);
    11261131    return VERR_NO_CONT_MEMORY;
    11271132}
     
    11321137        vbglPhysHeapChunkDelete(g_vbgldata.pChunkHead);
    11331138
    1134     RTSemFastMutexDestroy(g_vbgldata.mutexHeap);
    1135     g_vbgldata.mutexHeap = NIL_RTSEMFASTMUTEX;
    1136 }
    1137 
     1139    RTSemFastMutexDestroy(g_vbgldata.hMtxHeap);
     1140    g_vbgldata.hMtxHeap = NIL_RTSEMFASTMUTEX;
     1141}
     1142
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