/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */


/* This code is in the public domain.
** Version: 1.1  Author: Walt Karas
*/

#include "hmm_intrnl.h"

void *U(alloc)(U(descriptor) *desc, U(size_aau) n)
{
#ifdef HMM_AUDIT_FAIL

    if (desc->avl_tree_root)
        AUDIT_BLOCK(PTR_REC_TO_HEAD(desc->avl_tree_root))
#endif

        if (desc->last_freed)
        {
#ifdef HMM_AUDIT_FAIL
            AUDIT_BLOCK(desc->last_freed)
#endif

            U(into_free_collection)(desc, (head_record *)(desc->last_freed));

            desc->last_freed = 0;
        }

    /* Add space for block header. */
    n += HEAD_AAUS;

    /* Convert n from number of address alignment units to block alignment
    ** units. */
    n = DIV_ROUND_UP(n, HMM_BLOCK_ALIGN_UNIT);

    if (n < MIN_BLOCK_BAUS)
        n = MIN_BLOCK_BAUS;

    {
        /* Search for the first node of the bin containing the smallest
        ** block big enough to satisfy request. */
        ptr_record *ptr_rec_ptr =
            U(avl_search)(
                (U(avl_avl) *) & (desc->avl_tree_root), (U(size_bau)) n,
                AVL_GREATER_EQUAL);

        /* If an approprate bin is found, satisfy the allocation request,
        ** otherwise return null pointer. */
        return(ptr_rec_ptr ?
               U(alloc_from_bin)(desc, ptr_rec_ptr, (U(size_bau)) n) : 0);
    }
}
