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