CHeapCtrl *HeapCtrlInit(CHeapCtrl *hc=NULL, CTask *task=NULL, CBlkPool *bp)
{//See HeapLog() for an example.
//Duplicated for System Task.
        if (!hc)
                hc = ZCAlloc(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 blks 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);
        }
}