/*
 *  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
*/

#ifndef HMM_INTRNL_H_
#define HMM_INTRNL_H_

#ifdef __uClinux__
# include <lddk.h>
#endif

#include "heapmm.h"

#define U(BASE) HMM_UNIQUE(BASE)

/* Mask of high bit of variable of size_bau type. */
#define HIGH_BIT_BAU_SIZE \
    ((U(size_bau)) ~ (((U(size_bau)) ~ (U(size_bau)) 0) >> 1))

/* Add a given number of AAUs to pointer. */
#define AAUS_FORWARD(PTR, AAU_OFFSET) \
    (((char *) (PTR)) + ((AAU_OFFSET) * ((U(size_aau)) HMM_ADDR_ALIGN_UNIT)))

/* Subtract a given number of AAUs from pointer. */
#define AAUS_BACKWARD(PTR, AAU_OFFSET) \
    (((char *) (PTR)) - ((AAU_OFFSET) * ((U(size_aau)) HMM_ADDR_ALIGN_UNIT)))

/* Add a given number of BAUs to a pointer. */
#define BAUS_FORWARD(PTR, BAU_OFFSET) \
    AAUS_FORWARD((PTR), (BAU_OFFSET) * ((U(size_aau)) HMM_BLOCK_ALIGN_UNIT))

/* Subtract a given number of BAUs to a pointer. */
#define BAUS_BACKWARD(PTR, BAU_OFFSET) \
    AAUS_BACKWARD((PTR), (BAU_OFFSET) * ((U(size_aau)) HMM_BLOCK_ALIGN_UNIT))

typedef struct head_struct
{
    /* Sizes in Block Alignment Units. */
    HMM_UNIQUE(size_bau) previous_block_size, block_size;
}
head_record;

typedef struct ptr_struct
{
    struct ptr_struct *self, *prev, *next;
}
ptr_record;

/* Divide and round up any fraction to the next whole number. */
#define DIV_ROUND_UP(NUMER, DENOM) (((NUMER) + (DENOM) - 1) / (DENOM))

/* Number of AAUs in a block head. */
#define HEAD_AAUS DIV_ROUND_UP(sizeof(head_record), HMM_ADDR_ALIGN_UNIT)

/* Number of AAUs in a block pointer record. */
#define PTR_RECORD_AAUS DIV_ROUND_UP(sizeof(ptr_record), HMM_ADDR_ALIGN_UNIT)

/* Number of BAUs in a dummy end record (at end of chunk). */
#define DUMMY_END_BLOCK_BAUS DIV_ROUND_UP(HEAD_AAUS, HMM_BLOCK_ALIGN_UNIT)

/* Minimum number of BAUs in a block (allowing room for the pointer record. */
#define MIN_BLOCK_BAUS \
    DIV_ROUND_UP(HEAD_AAUS + PTR_RECORD_AAUS, HMM_BLOCK_ALIGN_UNIT)

/* Return number of BAUs in block (masking off high bit containing block
** status). */
#define BLOCK_BAUS(HEAD_PTR) \
    (((head_record *) (HEAD_PTR))->block_size & ~HIGH_BIT_BAU_SIZE)

/* Return number of BAUs in previous block (masking off high bit containing
** block status). */
#define PREV_BLOCK_BAUS(HEAD_PTR) \
    (((head_record *) (HEAD_PTR))->previous_block_size & ~HIGH_BIT_BAU_SIZE)

/* Set number of BAUs in previous block, preserving high bit containing
** block status. */
#define SET_PREV_BLOCK_BAUS(HEAD_PTR, N_BAUS) \
    { register head_record *h_ptr = (head_record *) (HEAD_PTR); \
        h_ptr->previous_block_size &= HIGH_BIT_BAU_SIZE; \
        h_ptr->previous_block_size |= (N_BAUS); }

/* Convert pointer to pointer record of block to pointer to block's head
** record. */
#define PTR_REC_TO_HEAD(PTR_REC_PTR) \
    ((head_record *) AAUS_BACKWARD(PTR_REC_PTR, HEAD_AAUS))

/* Convert pointer to block head to pointer to block's pointer record. */
#define HEAD_TO_PTR_REC(HEAD_PTR) \
    ((ptr_record *) AAUS_FORWARD(HEAD_PTR, HEAD_AAUS))

/* Returns non-zero if block is allocated. */
#define IS_BLOCK_ALLOCATED(HEAD_PTR) \
    (((((head_record *) (HEAD_PTR))->block_size | \
       ((head_record *) (HEAD_PTR))->previous_block_size) & \
      HIGH_BIT_BAU_SIZE) == 0)

#define MARK_BLOCK_ALLOCATED(HEAD_PTR) \
    { register head_record *h_ptr = (head_record *) (HEAD_PTR); \
        h_ptr->block_size &= ~HIGH_BIT_BAU_SIZE; \
        h_ptr->previous_block_size &= ~HIGH_BIT_BAU_SIZE; }

/* Mark a block as free when it is not the first block in a bin (and
** therefore not a node in the AVL tree). */
#define MARK_SUCCESSIVE_BLOCK_IN_FREE_BIN(HEAD_PTR) \
    { register head_record *h_ptr = (head_record *) (HEAD_PTR); \
        h_ptr->block_size |= HIGH_BIT_BAU_SIZE; }

/* Prototypes for internal functions implemented in one file and called in
** another.
*/

void U(into_free_collection)(U(descriptor) *desc, head_record *head_ptr);

void U(out_of_free_collection)(U(descriptor) *desc, head_record *head_ptr);

void *U(alloc_from_bin)(
    U(descriptor) *desc, ptr_record *bin_front_ptr, U(size_bau) n_baus);

#ifdef HMM_AUDIT_FAIL

/* Simply contains a reference to the HMM_AUDIT_FAIL macro and a
** dummy return. */
int U(audit_block_fail_dummy_return)(void);


/* Auditing a block consists of checking that the size in its head
** matches the previous block size in the head of the next block. */
#define AUDIT_BLOCK_AS_EXPR(HEAD_PTR) \
    ((BLOCK_BAUS(HEAD_PTR) == \
      PREV_BLOCK_BAUS(BAUS_FORWARD(HEAD_PTR, BLOCK_BAUS(HEAD_PTR)))) ? \
     0 : U(audit_block_fail_dummy_return)())

#define AUDIT_BLOCK(HEAD_PTR) \
    { void *h_ptr = (HEAD_PTR); AUDIT_BLOCK_AS_EXPR(h_ptr); }

#endif

/* Interface to AVL tree generic package instantiation. */

#define AVL_UNIQUE(BASE) U(avl_ ## BASE)

#define AVL_HANDLE ptr_record *

#define AVL_KEY U(size_bau)

#define AVL_MAX_DEPTH 64

#include "cavl_if.h"

#endif /* Include once. */
