Changeset 97930 in vbox
- Timestamp:
- Dec 31, 2022 3:33:06 AM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 155020
- 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 133 133 */ 134 134 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; 137 147 /** Indexed by VBGLPHYSHEAPBLOCK::fAllocated, so zero is the free ones and 138 * 148 * one the allocated ones. */ 139 149 int32_t acBlocks[2]; 150 /** Chunk */ 140 151 VBGLPHYSHEAPCHUNK *pChunkHead; 141 152 /** @} */ -
trunk/src/VBox/Additions/common/VBoxGuest/lib/VBoxGuestR0LibPhysHeap.cpp
r97929 r97930 44 44 * The physical memory heap consists of a doubly linked list of large chunks 45 45 * (VBGLDATA::pChunkHead), memory blocks are allocated within these chunks and 46 * are members of allocated (VBGLDATA:: pAllocBlocksHead) and free47 * (VBGLDATA:: pFreeBlocksHead) doubly linked lists.46 * are members of allocated (VBGLDATA::u.s.pAllocBlocksHead) and free 47 * (VBGLDATA::u.s.pFreeBlocksHead) doubly linked lists. 48 48 * 49 49 * When allocating a block, we search the free list for a suitable free block. … … 221 221 VBGL_PH_dprintf(("Allocated blocks:\n")); 222 222 223 VBGLPHYSHEAPBLOCK *pBlock = g_vbgldata. pAllocBlocksHead;223 VBGLPHYSHEAPBLOCK *pBlock = g_vbgldata.u.s.pAllocBlocksHead; 224 224 225 225 while (pBlock) … … 234 234 VBGL_PH_dprintf(("Free blocks:\n")); 235 235 236 pBlock = g_vbgldata. pFreeBlocksHead;236 pBlock = g_vbgldata.u.s.pFreeBlocksHead; 237 237 238 238 while (pBlock) … … 290 290 { 291 291 /* inserting to head of list */ 292 VBGLPHYSHEAPBLOCK *pOldHead = g_vbgldata.u.apHeads[fAllocated]; 293 294 pBlock->pNext = pOldHead; 292 295 pBlock->pPrev = NULL; 293 296 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; 312 300 } 313 301 … … 331 319 bool const fAllocated = pBlock->fAllocated; 332 320 333 if (pBlock->pNext) 334 pBlock->pNext->pPrev = pBlock->pPrev; 321 VBGLPHYSHEAPBLOCK *pOtherBlock = pBlock->pNext; 322 if (pOtherBlock) 323 pOtherBlock->pPrev = pBlock->pPrev; 335 324 /* else: this is tail of list but we do not maintain tails of block lists. so nothing to do. */ 336 325 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; 344 329 else 345 330 { 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; 348 333 } 349 334 … … 536 521 so HGCM processing in VMMDev can use page locks instead of several reads and writes. */ 537 522 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--) 539 524 { 540 525 AssertBreak(pIter->u32Signature == VBGL_PH_BLOCKSIGNATURE); … … 581 566 { 582 567 /* 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--) 584 569 { 585 570 AssertBreak(pIter->u32Signature == VBGL_PH_BLOCKSIGNATURE); … … 834 819 835 820 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) 837 822 { 838 823 Assert(pCurBlock->u32Signature == VBGL_PH_BLOCKSIGNATURE); … … 915 900 * Count each list and check that they contain the same number of nodes. 916 901 */ 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++) 919 903 { 920 904 unsigned cBlocks = 0; 921 905 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) 923 907 { 924 908 AssertReturn(pCurBlock->u32Signature == VBGL_PH_BLOCKSIGNATURE, … … 980 964 981 965 RTSemFastMutexDestroy(g_vbgldata.mutexHeap); 982 } 983 966 g_vbgldata.mutexHeap = NIL_RTSEMFASTMUTEX; 967 } 968
Note:
See TracChangeset
for help on using the changeset viewer.