190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* This code is in the public domain. 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber** Version: 1.1 Author: Walt Karas 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber*/ 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "hmm_intrnl.h" 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuangvoid U(grow_chunk)(U(descriptor) *desc, void *end, U(size_bau) n_baus) { 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef HEAD_PTR 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define HEAD_PTR ((head_record *) end) 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang end = BAUS_BACKWARD(end, DUMMY_END_BLOCK_BAUS); 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef HMM_AUDIT_FAIL 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 26ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang if (HEAD_PTR->block_size != 0) 27ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Chunk does not have valid dummy end block. */ 28ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang HMM_AUDIT_FAIL 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Create a new block that absorbs the old dummy end block. */ 33ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang HEAD_PTR->block_size = n_baus; 34ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 35ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Set up the new dummy end block. */ 36ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang { 37ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang head_record *dummy = (head_record *) BAUS_FORWARD(end, n_baus); 38ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dummy->previous_block_size = n_baus; 39ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang dummy->block_size = 0; 40ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang } 41ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang 42ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang /* Simply free the new block, allowing it to coalesce with any 43ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ** free block at that was the last block in the chunk prior to 44ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang ** growth. 45ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang */ 46ba164dffc5a6795bce97fae02b51ccf3330e15e4hkuang U(free)(desc, HEAD_TO_PTR_REC(end)); 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#undef HEAD_PTR 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 50