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);
    }
}