Lines Matching refs:pBlock

84  * @param   pBlock      Pointer to a RTHEAPOFFSETBLOCK structure.
86 #define RTHEAPOFFSETBLOCK_IS_VALID(pBlock) \
87 ( ((pBlock)->fFlags & RTHEAPOFFSETBLOCK_FLAGS_MAGIC_MASK) == RTHEAPOFFSETBLOCK_FLAGS_MAGIC )
92 * @param pBlock Pointer to a RTHEAPOFFSETBLOCK structure.
94 #define RTHEAPOFFSETBLOCK_IS_VALID_USED(pBlock) \
95 ( ((pBlock)->fFlags & (RTHEAPOFFSETBLOCK_FLAGS_MAGIC_MASK | RTHEAPOFFSETBLOCK_FLAGS_FREE)) \
101 * @param pBlock Pointer to a RTHEAPOFFSETBLOCK structure.
103 #define RTHEAPOFFSETBLOCK_IS_VALID_FREE(pBlock) \
104 ( ((pBlock)->fFlags & (RTHEAPOFFSETBLOCK_FLAGS_MAGIC_MASK | RTHEAPOFFSETBLOCK_FLAGS_FREE)) \
110 * @param pBlock Pointer to a valid RTHEAPOFFSETBLOCK structure.
112 #define RTHEAPOFFSETBLOCK_IS_FREE(pBlock) (!!((pBlock)->fFlags & RTHEAPOFFSETBLOCK_FLAGS_FREE))
178 * @param pBlock The block to find the heap anchor block for.
180 #define RTHEAPOFF_GET_ANCHOR(pBlock) ( (PRTHEAPOFFSETINTERNAL)((uint8_t *)(pBlock) - (pBlock)->offSelf ) )
236 #define ASSERT_PREV(pHeapInt, pBlock) \
237 do { ASSERT_ALIGN((pBlock)->offPrev); \
238 if ((pBlock)->offPrev) \
240 ASSERT_L((pBlock)->offPrev, RTHEAPOFF_TO_OFF(pHeapInt, pBlock)); \
241 ASSERT_GE((pBlock)->offPrev, sizeof(RTHEAPOFFSETINTERNAL)); \
244 Assert((pBlock) == (PRTHEAPOFFSETBLOCK)((pHeapInt) + 1)); \
247 #define ASSERT_NEXT(pHeap, pBlock) \
248 do { ASSERT_ALIGN((pBlock)->offNext); \
249 if ((pBlock)->offNext) \
251 ASSERT_L((pBlock)->offNext, (pHeapInt)->cbHeap); \
252 ASSERT_G((pBlock)->offNext, RTHEAPOFF_TO_OFF(pHeapInt, pBlock)); \
256 #define ASSERT_BLOCK(pHeapInt, pBlock) \
257 do { AssertMsg(RTHEAPOFFSETBLOCK_IS_VALID(pBlock), ("%#x\n", (pBlock)->fFlags)); \
258 AssertMsg(RTHEAPOFF_GET_ANCHOR(pBlock) == (pHeapInt), ("%p != %p\n", RTHEAPOFF_GET_ANCHOR(pBlock), (pHeapInt))); \
259 ASSERT_GE(RTHEAPOFF_TO_OFF(pHeapInt, pBlock), sizeof(RTHEAPOFFSETINTERNAL)); \
260 ASSERT_L( RTHEAPOFF_TO_OFF(pHeapInt, pBlock), (pHeapInt)->cbHeap); \
261 ASSERT_NEXT(pHeapInt, pBlock); \
262 ASSERT_PREV(pHeapInt, pBlock); \
265 #define ASSERT_BLOCK_USED(pHeapInt, pBlock) \
266 do { AssertMsg(RTHEAPOFFSETBLOCK_IS_VALID_USED((pBlock)), ("%#x\n", (pBlock)->fFlags)); \
267 AssertMsg(RTHEAPOFF_GET_ANCHOR(pBlock) == (pHeapInt), ("%p != %p\n", RTHEAPOFF_GET_ANCHOR(pBlock), (pHeapInt))); \
268 ASSERT_GE(RTHEAPOFF_TO_OFF(pHeapInt, pBlock), sizeof(RTHEAPOFFSETINTERNAL)); \
269 ASSERT_L( RTHEAPOFF_TO_OFF(pHeapInt, pBlock), (pHeapInt)->cbHeap); \
270 ASSERT_NEXT(pHeapInt, pBlock); \
271 ASSERT_PREV(pHeapInt, pBlock); \
274 #define ASSERT_FREE_PREV(pHeapInt, pBlock) \
275 do { ASSERT_ALIGN((pBlock)->offPrev); \
276 if ((pBlock)->offPrev) \
278 ASSERT_GE((pBlock)->offPrev, (pHeapInt)->offFreeHead); \
279 ASSERT_L((pBlock)->offPrev, RTHEAPOFF_TO_OFF(pHeapInt, pBlock)); \
280 ASSERT_LE((pBlock)->offPrev, (pBlock)->Core.offPrev); \
283 Assert((pBlock) == RTHEAPOFF_TO_PTR(pHeapInt, (pHeapInt)->offFreeHead, PRTHEAPOFFSETFREE) ); \
286 #define ASSERT_FREE_NEXT(pHeapInt, pBlock) \
287 do { ASSERT_ALIGN((pBlock)->offNext); \
288 if ((pBlock)->offNext) \
290 ASSERT_LE((pBlock)->offNext, (pHeapInt)->offFreeTail); \
291 ASSERT_G((pBlock)->offNext, RTHEAPOFF_TO_OFF(pHeapInt, pBlock)); \
292 ASSERT_GE((pBlock)->offNext, (pBlock)->Core.offNext); \
295 Assert((pBlock) == RTHEAPOFF_TO_PTR(pHeapInt, (pHeapInt)->offFreeTail, PRTHEAPOFFSETFREE)); \
299 # define ASSERT_FREE_CB(pHeapInt, pBlock) \
300 do { size_t cbCalc = ((pBlock)->Core.offNext ? (pBlock)->Core.offNext : (pHeapInt)->cbHeap) \
301 - RTHEAPOFF_TO_OFF((pHeapInt), (pBlock)) - sizeof(RTHEAPOFFSETBLOCK); \
302 AssertMsg((pBlock)->cb == cbCalc, ("cb=%#zx cbCalc=%#zx\n", (pBlock)->cb, cbCalc)); \
305 # define ASSERT_FREE_CB(pHeapInt, pBlock) do {} while (0)
309 #define ASSERT_BLOCK_FREE(pHeapInt, pBlock) \
310 do { ASSERT_BLOCK(pHeapInt, &(pBlock)->Core); \
311 Assert(RTHEAPOFFSETBLOCK_IS_VALID_FREE(&(pBlock)->Core)); \
312 ASSERT_GE(RTHEAPOFF_TO_OFF(pHeapInt, pBlock), (pHeapInt)->offFreeHead); \
313 ASSERT_LE(RTHEAPOFF_TO_OFF(pHeapInt, pBlock), (pHeapInt)->offFreeTail); \
314 ASSERT_FREE_NEXT(pHeapInt, pBlock); \
315 ASSERT_FREE_PREV(pHeapInt, pBlock); \
316 ASSERT_FREE_CB(pHeapInt, pBlock); \
333 static void rtHeapOffsetFreeBlock(PRTHEAPOFFSETINTERNAL pHeapInt, PRTHEAPOFFSETBLOCK pBlock);
424 PRTHEAPOFFSETBLOCK pBlock;
447 pBlock = rtHeapOffsetAllocBlock(pHeapInt, cb, cbAlignment);
448 if (RT_LIKELY(pBlock))
450 void *pv = pBlock + 1;
461 PRTHEAPOFFSETBLOCK pBlock;
484 pBlock = rtHeapOffsetAllocBlock(pHeapInt, cb, cbAlignment);
485 if (RT_LIKELY(pBlock))
487 void *pv = pBlock + 1;
650 PRTHEAPOFFSETBLOCK pBlock;
663 pBlock = (PRTHEAPOFFSETBLOCK)pv - 1;
664 pHeapInt = RTHEAPOFF_GET_ANCHOR(pBlock);
665 ASSERT_BLOCK_USED(pHeapInt, pBlock);
673 const size_t cbBlock = (pBlock->pNext ? (uintptr_t)pBlock->pNext : (uintptr_t)pHeapInt->pvEnd)
674 - (uintptr_t)pBlock - sizeof(RTHEAPOFFSETBLOCK);
675 memset(pBlock + 1, RTHEAPOFFSET_FREE_POISON, cbBlock);
681 rtHeapOffsetFreeBlock(pHeapInt, pBlock);
690 * @param pBlock The memory block to free.
692 static void rtHeapOffsetFreeBlock(PRTHEAPOFFSETINTERNAL pHeapInt, PRTHEAPOFFSETBLOCK pBlock)
694 PRTHEAPOFFSETFREE pFree = (PRTHEAPOFFSETFREE)pBlock;
726 AssertMsgReturnVoid(pLeft != pFree, ("Freed twice! pv=%p (pBlock=%p)\n", pBlock + 1, pBlock));
818 PRTHEAPOFFSETFREE pBlock;
819 for (pBlock = (PRTHEAPOFFSETFREE)(pHeapInt + 1);
820 pBlock;
821 pBlock = RTHEAPOFF_TO_PTR_N(pHeapInt, pBlock->Core.offNext, PRTHEAPOFFSETFREE))
823 if (RTHEAPOFFSETBLOCK_IS_FREE(&pBlock->Core))
825 ASSERT_BLOCK_FREE(pHeapInt, pBlock);
826 Assert(pBlock->offPrev == RTHEAPOFF_TO_OFF(pHeapInt, pPrevFree));
827 Assert(pPrevFree || pHeapInt->offFreeHead == RTHEAPOFF_TO_OFF(pHeapInt, pBlock));
828 pPrevFree = pBlock;
831 ASSERT_BLOCK_USED(pHeapInt, &pBlock->Core);
832 Assert(!pPrev || RTHEAPOFF_TO_OFF(pHeapInt, pPrev) == pBlock->Core.offPrev);
833 pPrev = pBlock;
843 PRTHEAPOFFSETBLOCK pBlock;
857 pBlock = (PRTHEAPOFFSETBLOCK)pv - 1;
858 pHeapInt = RTHEAPOFF_GET_ANCHOR(pBlock);
859 ASSERT_BLOCK_USED(pHeapInt, pBlock);
866 cbBlock = (pBlock->offNext ? pBlock->offNext : pHeapInt->cbHeap)
867 - RTHEAPOFF_TO_OFF(pHeapInt, pBlock) - sizeof(RTHEAPOFFSETBLOCK);
906 PRTHEAPOFFSETFREE pBlock;
911 for (pBlock = (PRTHEAPOFFSETFREE)(pHeapInt + 1);
912 pBlock;
913 pBlock = RTHEAPOFF_TO_PTR_N(pHeapInt, pBlock->Core.offNext, PRTHEAPOFFSETFREE))
915 size_t cb = (pBlock->offNext ? pBlock->Core.offNext : pHeapInt->cbHeap)
916 - RTHEAPOFF_TO_OFF(pHeapInt, pBlock) - sizeof(RTHEAPOFFSETBLOCK);
917 if (RTHEAPOFFSETBLOCK_IS_FREE(&pBlock->Core))
919 pBlock, pBlock->Core.offSelf, pBlock->Core.offNext, pBlock->Core.offPrev, pBlock->Core.fFlags, cb,
920 pBlock->cb, pBlock->offNext, pBlock->offPrev);
923 pBlock, pBlock->Core.offSelf, pBlock->Core.offNext, pBlock->Core.offPrev, pBlock->Core.fFlags, cb);