Lines Matching defs:pMA

69 static void hgsmiMABlockFree(HGSMIMADATA *pMA, HGSMIMABLOCK *pBlock)
71 pMA->env.pfnFree(pMA->env.pvEnv, pBlock);
74 static int hgsmiMABlockAlloc(HGSMIMADATA *pMA, HGSMIMABLOCK **ppBlock)
78 HGSMIMABLOCK *pBlock = (HGSMIMABLOCK *)pMA->env.pfnAlloc(pMA->env.pvEnv, sizeof(HGSMIMABLOCK));
93 static int hgsmiMAFormat(HGSMIMADATA *pMA)
98 pMA->cbMaxBlock = HGSMI_MA_BLOCK_SIZE_MIN;
99 pMA->cBlocks = 0;
102 HGSMISIZE cbRemaining = pMA->area.cbArea;
111 if (pMA->cbMaxBlock < cbBlock)
113 pMA->cbMaxBlock = cbBlock;
123 rc = hgsmiMABlockAlloc(pMA, &pBlock);
130 RTListAppend(&pMA->listBlocks, &pBlock->nodeBlock);
131 ++pMA->cBlocks;
149 static int hgsmiMARebuildFreeLists(HGSMIMADATA *pMA)
154 RTListForEach(&pMA->listBlocks, pIter, HGSMIMABLOCK, nodeBlock)
159 RTListAppend(&pMA->aListFreeBlocks[order], &pIter->nodeFree);
166 static int hgsmiMARestore(HGSMIMADATA *pMA, HGSMIOFFSET *paDescriptors, uint32_t cDescriptors, HGSMISIZE cbMaxBlock)
170 pMA->cbMaxBlock = cbMaxBlock;
171 pMA->cBlocks = 0;
173 HGSMISIZE cbRemaining = pMA->area.cbArea;
183 || cbBlock > pMA->cbMaxBlock)
191 rc = hgsmiMABlockAlloc(pMA, &pBlock);
198 RTListAppend(&pMA->listBlocks, &pBlock->nodeBlock);
199 ++pMA->cBlocks;
208 static HGSMIMABLOCK *hgsmiMAGetFreeBlock(HGSMIMADATA *pMA, HGSMIOFFSET order)
213 for (i = order; i < RT_ELEMENTS(pMA->aListFreeBlocks); ++i)
215 pBlock = RTListGetFirst(&pMA->aListFreeBlocks[i], HGSMIMABLOCK, nodeFree);
234 int rc = hgsmiMABlockAlloc(pMA, &pBlock2);
252 ++pMA->cBlocks;
255 RTListAppend(&pMA->aListFreeBlocks[i], &pBlock->nodeFree);
256 RTListAppend(&pMA->aListFreeBlocks[i], &pBlock2->nodeFree);
263 static void hgsmiMAReformatFreeBlocks(HGSMIMADATA *pMA, HGSMIOFFSET maxId,
310 RTListAppend(&pMA->aListFreeBlocks[order], &pBlock->nodeFree);
315 pBlock = RTListGetNext(&pMA->listBlocks, pBlock, HGSMIMABLOCK, nodeBlock);
335 HGSMIMABLOCK *pNext = RTListGetNext(&pMA->listBlocks, pBlock, HGSMIMABLOCK, nodeBlock);
339 --pMA->cBlocks;
341 hgsmiMABlockFree(pMA, pBlock);
353 static void hgsmiMAQueryFreeRange(HGSMIMADATA *pMA, HGSMIMABLOCK *pBlock, HGSMISIZE cbRequired,
365 p = RTListGetNext(&pMA->listBlocks, *ppEnd, HGSMIMABLOCK, nodeBlock);
380 p = RTListGetPrev(&pMA->listBlocks, *ppStart, HGSMIMABLOCK, nodeBlock);
395 static void hgsmiMAMergeFreeBlocks(HGSMIMADATA *pMA, HGSMIOFFSET order)
418 RTListForEach(&pMA->aListFreeBlocks[i], pIter, HGSMIMABLOCK, nodeFree)
425 hgsmiMAQueryFreeRange(pMA, pIter, cbRequired, &pFreeStart, &pFreeEnd, &cbBlocks);
433 hgsmiMAReformatFreeBlocks(pMA, order, pFreeStart, pFreeEnd, cbBlocks);
448 static HGSMIOFFSET hgsmiMAAlloc(HGSMIMADATA *pMA, HGSMISIZE cb)
450 if (cb > pMA->cbMaxBlock)
463 AssertReturn(order < RT_ELEMENTS(pMA->aListFreeBlocks), HGSMIOFFSET_VOID);
465 HGSMIMABLOCK *pBlock = hgsmiMAGetFreeBlock(pMA, order);
469 hgsmiMAMergeFreeBlocks(pMA, order);
470 pBlock = hgsmiMAGetFreeBlock(pMA, order);
483 static void hgsmiMAFree(HGSMIMADATA *pMA, HGSMIOFFSET off)
493 HGSMIMABLOCK *pBlock = HGSMIMASearchOffset(pMA, off);
500 RTListAppend(&pMA->aListFreeBlocks[HGSMI_MA_DESC_ORDER(pBlock->descriptor)], &pBlock->nodeFree);
508 int HGSMIMAInit(HGSMIMADATA *pMA, const HGSMIAREA *pArea,
515 RT_ZERO(*pMA);
519 int rc = HGSMIAreaInitialize(&pMA->area, pArea->pu8Base, cb, 0);
522 pMA->env = *pEnv;
525 for (i = 0; i < RT_ELEMENTS(pMA->aListFreeBlocks); ++i)
527 RTListInit(&pMA->aListFreeBlocks[i]);
529 RTListInit(&pMA->listBlocks);
533 rc = hgsmiMARestore(pMA, paDescriptors, cDescriptors, cbMaxBlock);
537 rc = hgsmiMAFormat(pMA);
542 rc = hgsmiMARebuildFreeLists(pMA);
549 void HGSMIMAUninit(HGSMIMADATA *pMA)
554 RTListForEachSafe(&pMA->listBlocks, pIter, pNext, HGSMIMABLOCK, nodeBlock)
557 hgsmiMABlockFree(pMA, pIter);
560 RT_ZERO(*pMA);
563 HGSMIOFFSET HGSMIMAPointerToOffset(const HGSMIMADATA *pMA, const void *pv)
565 if (HGSMIAreaContainsPointer(&pMA->area, pv))
567 return HGSMIPointerToOffset(&pMA->area, pv);
574 void *HGSMIMAOffsetToPointer(const HGSMIMADATA *pMA, HGSMIOFFSET off)
576 if (HGSMIAreaContainsOffset(&pMA->area, off))
578 return HGSMIOffsetToPointer(&pMA->area, off);
585 void *HGSMIMAAlloc(HGSMIMADATA *pMA, HGSMISIZE cb)
587 HGSMIOFFSET off = hgsmiMAAlloc(pMA, cb);
588 return HGSMIMAOffsetToPointer(pMA, off);
591 void HGSMIMAFree(HGSMIMADATA *pMA, void *pv)
593 HGSMIOFFSET off = HGSMIMAPointerToOffset(pMA, pv);
596 hgsmiMAFree(pMA, off);
604 HGSMIMABLOCK *HGSMIMASearchOffset(HGSMIMADATA *pMA, HGSMIOFFSET off)
607 HGSMIMABLOCK *pStart = RTListGetFirst(&pMA->listBlocks, HGSMIMABLOCK, nodeBlock);
608 HGSMIMABLOCK *pEnd = RTListGetLast(&pMA->listBlocks, HGSMIMABLOCK, nodeBlock);
612 uint32_t iEnd = pMA->cBlocks;