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