/*
* 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
*/
/* External header file for Heap Memory Manager. See documentation in
** heapmm.html.
*/
#undef HMM_PROCESS
/* Include once per configuration in a particular translation unit. */
#ifndef HMM_CNFG_NUM
/* Default configuration. */
#ifndef HMM_INC_CNFG_DFLT
#define HMM_INC_CNFG_DFLT
#define HMM_PROCESS
#endif
#elif HMM_CNFG_NUM == 0
/* Test configuration. */
#ifndef HMM_INC_CNFG_0
#define HMM_INC_CNFG_0
#define HMM_PROCESS
#endif
#elif HMM_CNFG_NUM == 1
#ifndef HMM_INC_CNFG_1
#define HMM_INC_CNFG_1
#define HMM_PROCESS
#endif
#elif HMM_CNFG_NUM == 2
#ifndef HMM_INC_CNFG_2
#define HMM_INC_CNFG_2
#define HMM_PROCESS
#endif
#elif HMM_CNFG_NUM == 3
#ifndef HMM_INC_CNFG_3
#define HMM_INC_CNFG_3
#define HMM_PROCESS
#endif
#elif HMM_CNFG_NUM == 4
#ifndef HMM_INC_CNFG_4
#define HMM_INC_CNFG_4
#define HMM_PROCESS
#endif
#elif HMM_CNFG_NUM == 5
#ifndef HMM_INC_CNFG_5
#define HMM_INC_CNFG_5
#define HMM_PROCESS
#endif
#endif
#ifdef HMM_PROCESS
#include "hmm_cnfg.h"
/* Heap descriptor. */
typedef struct HMM_UNIQUE(structure)
{
/* private: */
/* Pointer to (payload of) root node in AVL tree. This field should
** really be the AVL tree descriptor (type avl_avl). But (in the
** instantiation of the AVL tree generic package used in package) the
** AVL tree descriptor simply contains a pointer to the root. So,
** whenever a pointer to the AVL tree descriptor is needed, I use the
** cast:
**
** (avl_avl *) &(heap_desc->avl_tree_root)
**
** (where heap_desc is a pointer to a heap descriptor). This trick
** allows me to avoid including cavl_if.h in this external header. */
void *avl_tree_root;
/* Pointer to first byte of last block freed, after any coalescing. */
void *last_freed;
/* public: */
HMM_UNIQUE(size_bau) num_baus_can_shrink;
void *end_of_shrinkable_chunk;
}
HMM_UNIQUE(descriptor);
/* Prototypes for externally-callable functions. */
void HMM_UNIQUE(init)(HMM_UNIQUE(descriptor) *desc);
void *HMM_UNIQUE(alloc)(
HMM_UNIQUE(descriptor) *desc, HMM_UNIQUE(size_aau) num_addr_align_units);
/* NOT YET IMPLEMENTED */
void *HMM_UNIQUE(greedy_alloc)(
HMM_UNIQUE(descriptor) *desc, HMM_UNIQUE(size_aau) needed_addr_align_units,
HMM_UNIQUE(size_aau) coveted_addr_align_units);
int HMM_UNIQUE(resize)(
HMM_UNIQUE(descriptor) *desc, void *mem,
HMM_UNIQUE(size_aau) num_addr_align_units);
/* NOT YET IMPLEMENTED */
int HMM_UNIQUE(greedy_resize)(
HMM_UNIQUE(descriptor) *desc, void *mem,
HMM_UNIQUE(size_aau) needed_addr_align_units,
HMM_UNIQUE(size_aau) coveted_addr_align_units);
void HMM_UNIQUE(free)(HMM_UNIQUE(descriptor) *desc, void *mem);
HMM_UNIQUE(size_aau) HMM_UNIQUE(true_size)(void *mem);
HMM_UNIQUE(size_aau) HMM_UNIQUE(largest_available)(
HMM_UNIQUE(descriptor) *desc);
void HMM_UNIQUE(new_chunk)(
HMM_UNIQUE(descriptor) *desc, void *start_of_chunk,
HMM_UNIQUE(size_bau) num_block_align_units);
void HMM_UNIQUE(grow_chunk)(
HMM_UNIQUE(descriptor) *desc, void *end_of_chunk,
HMM_UNIQUE(size_bau) num_block_align_units);
/* NOT YET IMPLEMENTED */
void HMM_UNIQUE(shrink_chunk)(
HMM_UNIQUE(descriptor) *desc,
HMM_UNIQUE(size_bau) num_block_align_units);
#endif /* defined HMM_PROCESS */