1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*
2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *
4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  Use of this source code is governed by a BSD-style license
5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  that can be found in the LICENSE file in the root of the source
6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  tree. An additional intellectual property rights grant can be found
7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  in the file PATENTS.  All contributing project authors may
8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org *  be found in the AUTHORS file in the root of the source tree.
9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */
10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* This code is in the public domain.
13474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org** Version: 1.1  Author: Walt Karas
14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org*/
15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "hmm_intrnl.h"
17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgvoid *U(alloc)(U(descriptor) *desc, U(size_aau) n) {
19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef HMM_AUDIT_FAIL
20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  if (desc->avl_tree_root)
226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    AUDIT_BLOCK(PTR_REC_TO_HEAD(desc->avl_tree_root))
23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    if (desc->last_freed) {
26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifdef HMM_AUDIT_FAIL
276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org      AUDIT_BLOCK(desc->last_freed)
28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif
29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org      U(into_free_collection)(desc, (head_record *)(desc->last_freed));
31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org
326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org      desc->last_freed = 0;
33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org    }
346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  /* Add space for block header. */
366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  n += HEAD_AAUS;
376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  /* Convert n from number of address alignment units to block alignment
396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  ** units. */
406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  n = DIV_ROUND_UP(n, HMM_BLOCK_ALIGN_UNIT);
416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  if (n < MIN_BLOCK_BAUS)
436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    n = MIN_BLOCK_BAUS;
446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  {
466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    /* Search for the first node of the bin containing the smallest
476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ** block big enough to satisfy request. */
486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ptr_record *ptr_rec_ptr =
496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org      U(avl_search)(
506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        (U(avl_avl) *) & (desc->avl_tree_root), (U(size_bau)) n,
516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org        AVL_GREATER_EQUAL);
526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org
536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    /* If an approprate bin is found, satisfy the allocation request,
546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    ** otherwise return null pointer. */
556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org    return(ptr_rec_ptr ?
566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org           U(alloc_from_bin)(desc, ptr_rec_ptr, (U(size_bau)) n) : 0);
576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org  }
58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}
59