Lines Matching refs:pBlock

239  * @param   pBlock          The block.
245 DECLINLINE(int) rtHeapPageAllocFromBlockSuccess(PRTHEAPPAGEBLOCK pBlock, uint32_t iPage, size_t cPages, bool fZero, void **ppv)
247 PRTHEAPPAGE pHeap = pBlock->pHeap;
249 ASMBitSet(&pBlock->bmFirst[0], iPage);
250 pBlock->cFreePages -= cPages;
252 if (!pHeap->pHint2 || pHeap->pHint2->cFreePages < pBlock->cFreePages)
253 pHeap->pHint2 = pBlock;
256 void *pv = (uint8_t *)pBlock->Core.Key + (iPage << PAGE_SHIFT);
269 * @param pBlock The block.
273 DECLINLINE(bool) rtHeapPageIsPageRangeFree(PRTHEAPPAGEBLOCK pBlock, uint32_t iFirst, uint32_t cPages)
278 if (ASMBitTest(&pBlock->bmAlloc[0], i))
280 Assert(!ASMBitTest(&pBlock->bmFirst[0], i));
291 * @param pBlock The block to allocate from.
296 DECLINLINE(int) rtHeapPageAllocFromBlock(PRTHEAPPAGEBLOCK pBlock, size_t cPages, bool fZero, void **ppv)
298 if (pBlock->cFreePages >= cPages)
300 int iPage = ASMBitFirstClear(&pBlock->bmAlloc[0], RTMEMPAGEPOSIX_BLOCK_PAGE_COUNT);
306 ASMBitSet(&pBlock->bmAlloc[0], iPage);
307 return rtHeapPageAllocFromBlockSuccess(pBlock, iPage, cPages, fZero, ppv);
313 if (rtHeapPageIsPageRangeFree(pBlock, iPage + 1, cPages - 1))
315 ASMBitSetRange(&pBlock->bmAlloc[0], iPage, iPage + cPages);
316 return rtHeapPageAllocFromBlockSuccess(pBlock, iPage, cPages, fZero, ppv);
320 iPage = ASMBitNextSet(&pBlock->bmAlloc[0], RTMEMPAGEPOSIX_BLOCK_PAGE_COUNT, iPage);
323 iPage = ASMBitNextClear(&pBlock->bmAlloc[0], RTMEMPAGEPOSIX_BLOCK_PAGE_COUNT, iPage);
340 PRTHEAPPAGEBLOCK pBlock = RT_FROM_MEMBER(pNode, RTHEAPPAGEBLOCK, Core);
342 int rc = rtHeapPageAllocFromBlock(pBlock, pArgs->cPages, pArgs->fZero, &pArgs->pvAlloc);
415 PRTHEAPPAGEBLOCK pBlock;
418 pBlock = (PRTHEAPPAGEBLOCK)g_pfnOrgMalloc(sizeof(*pBlock));
421 pBlock = (PRTHEAPPAGEBLOCK)rtMemBaseAlloc(sizeof(*pBlock));
422 if (!pBlock)
429 RT_ZERO(*pBlock);
430 pBlock->Core.Key = pvPages;
431 pBlock->Core.KeyLast = (uint8_t *)pvPages + RTMEMPAGEPOSIX_BLOCK_SIZE - 1;
432 pBlock->cFreePages = RTMEMPAGEPOSIX_BLOCK_PAGE_COUNT;
433 pBlock->pHeap = pHeap;
437 bool fRc = RTAvlrPVInsert(&pHeap->BlockTree, &pBlock->Core); Assert(fRc); NOREF(fRc);
444 rc = rtHeapPageAllocFromBlock(pBlock, cPages, fZero, ppv);
496 PRTHEAPPAGEBLOCK pBlock = RT_FROM_MEMBER(pNode, RTHEAPPAGEBLOCK, Core);
497 if (pBlock->cFreePages == RTMEMPAGEPOSIX_BLOCK_PAGE_COUNT)
499 *(PRTHEAPPAGEBLOCK *)pvUser = pBlock;
530 PRTHEAPPAGEBLOCK pBlock = (PRTHEAPPAGEBLOCK)RTAvlrPVRangeGet(&pHeap->BlockTree, pv);
531 if (pBlock)
536 uint32_t const iPage = (uint32_t)(((uintptr_t)pv - (uintptr_t)pBlock->Core.Key) >> PAGE_SHIFT);
540 fOk = fOk && ASMBitTest(&pBlock->bmFirst[0], iPage);
543 || ASMBitTest(&pBlock->bmFirst[0], iPage + cPages)
544 || !ASMBitTest(&pBlock->bmAlloc[0], iPage + cPages));
548 fOk = ASMBitTest(&pBlock->bmAlloc[0], i)
549 && !ASMBitTest(&pBlock->bmFirst[0], i);
555 ASMBitClearRange(&pBlock->bmAlloc[0], iPage, iPage + cPages);
556 ASMBitClear(&pBlock->bmFirst[0], iPage);
557 pBlock->cFreePages += cPages;
560 if (!pHeap->pHint1 || pHeap->pHint1->cFreePages < pBlock->cFreePages)
561 pHeap->pHint1 = pBlock;
576 pBlock = NULL;
578 rtHeapPageFindUnusedBlockCallback, &pBlock);
579 if (!pBlock)
582 void *pv2 = RTAvlrPVRemove(&pHeap->BlockTree, pBlock->Core.Key); Assert(pv2); NOREF(pv2);
589 munmap(pBlock->Core.Key, RTMEMPAGEPOSIX_BLOCK_SIZE);
590 pBlock->Core.Key = pBlock->Core.KeyLast = NULL;
591 pBlock->cFreePages = 0;
594 g_pfnOrgFree(pBlock);
597 rtMemBaseFree(pBlock);