Lines Matching refs:pBlock

83  * @param   pBlock      Pointer to a RTHEAPSIMPLEBLOCK structure.
85 #define RTHEAPSIMPLEBLOCK_IS_VALID(pBlock) \
86 ( ((pBlock)->fFlags & RTHEAPSIMPLEBLOCK_FLAGS_MAGIC_MASK) == RTHEAPSIMPLEBLOCK_FLAGS_MAGIC )
91 * @param pBlock Pointer to a RTHEAPSIMPLEBLOCK structure.
93 #define RTHEAPSIMPLEBLOCK_IS_VALID_USED(pBlock) \
94 ( ((pBlock)->fFlags & (RTHEAPSIMPLEBLOCK_FLAGS_MAGIC_MASK | RTHEAPSIMPLEBLOCK_FLAGS_FREE)) \
100 * @param pBlock Pointer to a RTHEAPSIMPLEBLOCK structure.
102 #define RTHEAPSIMPLEBLOCK_IS_VALID_FREE(pBlock) \
103 ( ((pBlock)->fFlags & (RTHEAPSIMPLEBLOCK_FLAGS_MAGIC_MASK | RTHEAPSIMPLEBLOCK_FLAGS_FREE)) \
109 * @param pBlock Pointer to a valid RTHEAPSIMPLEBLOCK structure.
111 #define RTHEAPSIMPLEBLOCK_IS_FREE(pBlock) (!!((pBlock)->fFlags & RTHEAPSIMPLEBLOCK_FLAGS_FREE))
180 #define ASSERT_PREV(pHeapInt, pBlock) \
181 do { ASSERT_ALIGN((pBlock)->pPrev); \
182 if ((pBlock)->pPrev) \
184 ASSERT_L((pBlock)->pPrev, (pBlock)); \
185 ASSERT_GE((pBlock)->pPrev, (pHeapInt) + 1); \
188 Assert((pBlock) == (PRTHEAPSIMPLEBLOCK)((pHeapInt) + 1)); \
191 #define ASSERT_NEXT(pHeap, pBlock) \
192 do { ASSERT_ALIGN((pBlock)->pNext); \
193 if ((pBlock)->pNext) \
195 ASSERT_L((pBlock)->pNext, (pHeapInt)->pvEnd); \
196 ASSERT_G((pBlock)->pNext, (pBlock)); \
200 #define ASSERT_BLOCK(pHeapInt, pBlock) \
201 do { AssertMsg(RTHEAPSIMPLEBLOCK_IS_VALID(pBlock), ("%#x\n", (pBlock)->fFlags)); \
202 AssertMsg((pBlock)->pHeap == (pHeapInt), ("%p != %p\n", (pBlock)->pHeap, (pHeapInt))); \
203 ASSERT_GE((pBlock), (pHeapInt) + 1); \
204 ASSERT_L((pBlock), (pHeapInt)->pvEnd); \
205 ASSERT_NEXT(pHeapInt, pBlock); \
206 ASSERT_PREV(pHeapInt, pBlock); \
209 #define ASSERT_BLOCK_USED(pHeapInt, pBlock) \
210 do { AssertMsg(RTHEAPSIMPLEBLOCK_IS_VALID_USED((pBlock)), ("%#x\n", (pBlock)->fFlags)); \
211 AssertMsg((pBlock)->pHeap == (pHeapInt), ("%p != %p\n", (pBlock)->pHeap, (pHeapInt))); \
212 ASSERT_GE((pBlock), (pHeapInt) + 1); \
213 ASSERT_L((pBlock), (pHeapInt)->pvEnd); \
214 ASSERT_NEXT(pHeapInt, pBlock); \
215 ASSERT_PREV(pHeapInt, pBlock); \
218 #define ASSERT_FREE_PREV(pHeapInt, pBlock) \
219 do { ASSERT_ALIGN((pBlock)->pPrev); \
220 if ((pBlock)->pPrev) \
222 ASSERT_GE((pBlock)->pPrev, (pHeapInt)->pFreeHead); \
223 ASSERT_L((pBlock)->pPrev, (pBlock)); \
224 ASSERT_LE((pBlock)->pPrev, (pBlock)->Core.pPrev); \
227 Assert((pBlock) == (pHeapInt)->pFreeHead); \
230 #define ASSERT_FREE_NEXT(pHeapInt, pBlock) \
231 do { ASSERT_ALIGN((pBlock)->pNext); \
232 if ((pBlock)->pNext) \
234 ASSERT_LE((pBlock)->pNext, (pHeapInt)->pFreeTail); \
235 ASSERT_G((pBlock)->pNext, (pBlock)); \
236 ASSERT_GE((pBlock)->pNext, (pBlock)->Core.pNext); \
239 Assert((pBlock) == (pHeapInt)->pFreeTail); \
243 # define ASSERT_FREE_CB(pHeapInt, pBlock) \
244 do { size_t cbCalc = ((pBlock)->Core.pNext ? (uintptr_t)(pBlock)->Core.pNext : (uintptr_t)(pHeapInt)->pvEnd) \
245 - (uintptr_t)(pBlock) - sizeof(RTHEAPSIMPLEBLOCK); \
246 AssertMsg((pBlock)->cb == cbCalc, ("cb=%#zx cbCalc=%#zx\n", (pBlock)->cb, cbCalc)); \
249 # define ASSERT_FREE_CB(pHeapInt, pBlock) do {} while (0)
253 #define ASSERT_BLOCK_FREE(pHeapInt, pBlock) \
254 do { ASSERT_BLOCK(pHeapInt, &(pBlock)->Core); \
255 Assert(RTHEAPSIMPLEBLOCK_IS_VALID_FREE(&(pBlock)->Core)); \
256 ASSERT_GE((pBlock), (pHeapInt)->pFreeHead); \
257 ASSERT_LE((pBlock), (pHeapInt)->pFreeTail); \
258 ASSERT_FREE_NEXT(pHeapInt, pBlock); \
259 ASSERT_FREE_PREV(pHeapInt, pBlock); \
260 ASSERT_FREE_CB(pHeapInt, pBlock); \
277 static void rtHeapSimpleFreeBlock(PRTHEAPSIMPLEINTERNAL pHeapInt, PRTHEAPSIMPLEBLOCK pBlock);
392 PRTHEAPSIMPLEBLOCK pBlock;
415 pBlock = rtHeapSimpleAllocBlock(pHeapInt, cb, cbAlignment);
416 if (RT_LIKELY(pBlock))
418 void *pv = pBlock + 1;
429 PRTHEAPSIMPLEBLOCK pBlock;
452 pBlock = rtHeapSimpleAllocBlock(pHeapInt, cb, cbAlignment);
453 if (RT_LIKELY(pBlock))
455 void *pv = pBlock + 1;
642 PRTHEAPSIMPLEBLOCK pBlock;
655 pBlock = (PRTHEAPSIMPLEBLOCK)pv - 1;
656 pHeapInt = pBlock->pHeap;
657 ASSERT_BLOCK_USED(pHeapInt, pBlock);
665 const size_t cbBlock = (pBlock->pNext ? (uintptr_t)pBlock->pNext : (uintptr_t)pHeapInt->pvEnd)
666 - (uintptr_t)pBlock - sizeof(RTHEAPSIMPLEBLOCK);
667 memset(pBlock + 1, RTHEAPSIMPLE_FREE_POISON, cbBlock);
673 rtHeapSimpleFreeBlock(pHeapInt, pBlock);
682 * @param pBlock The memory block to free.
684 static void rtHeapSimpleFreeBlock(PRTHEAPSIMPLEINTERNAL pHeapInt, PRTHEAPSIMPLEBLOCK pBlock)
686 PRTHEAPSIMPLEFREE pFree = (PRTHEAPSIMPLEFREE)pBlock;
718 AssertMsgReturnVoid(pLeft != pFree, ("Freed twice! pv=%p (pBlock=%p)\n", pBlock + 1, pBlock));
810 PRTHEAPSIMPLEFREE pBlock;
811 for (pBlock = (PRTHEAPSIMPLEFREE)(pHeapInt + 1);
812 pBlock;
813 pBlock = (PRTHEAPSIMPLEFREE)pBlock->Core.pNext)
815 if (RTHEAPSIMPLEBLOCK_IS_FREE(&pBlock->Core))
817 ASSERT_BLOCK_FREE(pHeapInt, pBlock);
818 Assert(pBlock->pPrev == pPrevFree);
819 Assert(pPrevFree || pHeapInt->pFreeHead == pBlock);
820 pPrevFree = pBlock;
823 ASSERT_BLOCK_USED(pHeapInt, &pBlock->Core);
824 Assert(!pPrev || pPrev == (PRTHEAPSIMPLEFREE)pBlock->Core.pPrev);
825 pPrev = pBlock;
835 PRTHEAPSIMPLEBLOCK pBlock;
849 pBlock = (PRTHEAPSIMPLEBLOCK)pv - 1;
850 pHeapInt = pBlock->pHeap;
851 ASSERT_BLOCK_USED(pHeapInt, pBlock);
858 cbBlock = (pBlock->pNext ? (uintptr_t)pBlock->pNext : (uintptr_t)pHeapInt->pvEnd)
859 - (uintptr_t)pBlock- sizeof(RTHEAPSIMPLEBLOCK);
898 PRTHEAPSIMPLEFREE pBlock;
903 for (pBlock = (PRTHEAPSIMPLEFREE)(pHeapInt + 1);
904 pBlock;
905 pBlock = (PRTHEAPSIMPLEFREE)pBlock->Core.pNext)
907 size_t cb = (pBlock->pNext ? (uintptr_t)pBlock->Core.pNext : (uintptr_t)pHeapInt->pvEnd)
908 - (uintptr_t)pBlock - sizeof(RTHEAPSIMPLEBLOCK);
909 if (RTHEAPSIMPLEBLOCK_IS_FREE(&pBlock->Core))
911 pBlock, (uintptr_t)pBlock - (uintptr_t)(pHeapInt + 1), pBlock->Core.pNext, pBlock->Core.pPrev, pBlock->Core.fFlags, cb,
912 pBlock->cb, pBlock->pNext, pBlock->pPrev);
915 pBlock, (uintptr_t)pBlock - (uintptr_t)(pHeapInt + 1), pBlock->Core.pNext, pBlock->Core.pPrev, pBlock->Core.fFlags, cb);