CHeapCtrl *HeapCtrlInit(CHeapCtrl *hc=NULL, CTask *task=NULL, CBlkPool *bp) {//See HeapLog() for an example. //Duplicated for System Task. if (!hc) hc = SysCAlloc(sizeof(CHeapCtrl)); hc->hc_signature = HEAP_CTRL_SIGNATURE_VAL; hc->mem_task = task; hc->bp = bp; QueueInit(&hc->next_mem_blk); hc->last_mergable = NULL; hc->next_um = hc->last_um = (&hc->next_um)(U8 *) - offset(CMemUsed.next); return hc; } U0 HeapCtrlDel(CHeapCtrl *hc) {//Free all blocks alloced to a HeapCtrl. CMemBlk *m, *m1; if (hc) { PUSHFD CLI while (LBts(&hc->locked_flags, HClf_LOCKED)) PAUSE m = hc->next_mem_blk; while (m != &hc->next_mem_blk) { m1 = m->next; MemPagTaskFree(m, hc); m = m1; } LBtr(&hc->locked_flags, HClf_LOCKED); POPFD Free(hc); } }