1 /* 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef VPX_MEM_MEMORY_MANAGER_INCLUDE_HEAPMM_H_ 12 #define VPX_MEM_MEMORY_MANAGER_INCLUDE_HEAPMM_H_ 13 14 /* This code is in the public domain. 15 ** Version: 1.1 Author: Walt Karas 16 */ 17 18 /* External header file for Heap Memory Manager. See documentation in 19 ** heapmm.html. 20 */ 21 22 #undef HMM_PROCESS 23 24 /* Include once per configuration in a particular translation unit. */ 25 26 #ifndef HMM_CNFG_NUM 27 28 /* Default configuration. */ 29 30 #ifndef HMM_INC_CNFG_DFLT 31 #define HMM_INC_CNFG_DFLT 32 #define HMM_PROCESS 33 #endif 34 35 #elif HMM_CNFG_NUM == 0 36 37 /* Test configuration. */ 38 39 #ifndef HMM_INC_CNFG_0 40 #define HMM_INC_CNFG_0 41 #define HMM_PROCESS 42 #endif 43 44 #elif HMM_CNFG_NUM == 1 45 46 #ifndef HMM_INC_CNFG_1 47 #define HMM_INC_CNFG_1 48 #define HMM_PROCESS 49 #endif 50 51 #elif HMM_CNFG_NUM == 2 52 53 #ifndef HMM_INC_CNFG_2 54 #define HMM_INC_CNFG_2 55 #define HMM_PROCESS 56 #endif 57 58 #elif HMM_CNFG_NUM == 3 59 60 #ifndef HMM_INC_CNFG_3 61 #define HMM_INC_CNFG_3 62 #define HMM_PROCESS 63 #endif 64 65 #elif HMM_CNFG_NUM == 4 66 67 #ifndef HMM_INC_CNFG_4 68 #define HMM_INC_CNFG_4 69 #define HMM_PROCESS 70 #endif 71 72 #elif HMM_CNFG_NUM == 5 73 74 #ifndef HMM_INC_CNFG_5 75 #define HMM_INC_CNFG_5 76 #define HMM_PROCESS 77 #endif 78 79 #endif 80 81 #ifdef HMM_PROCESS 82 83 #include "hmm_cnfg.h" 84 85 /* Heap descriptor. */ 86 typedef struct HMM_UNIQUE(structure) { 87 /* private: */ 88 89 /* Pointer to (payload of) root node in AVL tree. This field should 90 ** really be the AVL tree descriptor (type avl_avl). But (in the 91 ** instantiation of the AVL tree generic package used in package) the 92 ** AVL tree descriptor simply contains a pointer to the root. So, 93 ** whenever a pointer to the AVL tree descriptor is needed, I use the 94 ** cast: 95 ** 96 ** (avl_avl *) &(heap_desc->avl_tree_root) 97 ** 98 ** (where heap_desc is a pointer to a heap descriptor). This trick 99 ** allows me to avoid including cavl_if.h in this external header. */ 100 void *avl_tree_root; 101 102 /* Pointer to first byte of last block freed, after any coalescing. */ 103 void *last_freed; 104 105 /* public: */ 106 107 HMM_UNIQUE(size_bau) num_baus_can_shrink; 108 void *end_of_shrinkable_chunk; 109 } 110 HMM_UNIQUE(descriptor); 111 112 /* Prototypes for externally-callable functions. */ 113 114 void HMM_UNIQUE(init)(HMM_UNIQUE(descriptor) *desc); 115 116 void *HMM_UNIQUE(alloc)( 117 HMM_UNIQUE(descriptor) *desc, HMM_UNIQUE(size_aau) num_addr_align_units); 118 119 /* NOT YET IMPLEMENTED */ 120 void *HMM_UNIQUE(greedy_alloc)( 121 HMM_UNIQUE(descriptor) *desc, HMM_UNIQUE(size_aau) needed_addr_align_units, 122 HMM_UNIQUE(size_aau) coveted_addr_align_units); 123 124 int HMM_UNIQUE(resize)( 125 HMM_UNIQUE(descriptor) *desc, void *mem, 126 HMM_UNIQUE(size_aau) num_addr_align_units); 127 128 /* NOT YET IMPLEMENTED */ 129 int HMM_UNIQUE(greedy_resize)( 130 HMM_UNIQUE(descriptor) *desc, void *mem, 131 HMM_UNIQUE(size_aau) needed_addr_align_units, 132 HMM_UNIQUE(size_aau) coveted_addr_align_units); 133 134 void HMM_UNIQUE(free)(HMM_UNIQUE(descriptor) *desc, void *mem); 135 136 HMM_UNIQUE(size_aau) HMM_UNIQUE(true_size)(void *mem); 137 138 HMM_UNIQUE(size_aau) HMM_UNIQUE(largest_available)( 139 HMM_UNIQUE(descriptor) *desc); 140 141 void HMM_UNIQUE(new_chunk)( 142 HMM_UNIQUE(descriptor) *desc, void *start_of_chunk, 143 HMM_UNIQUE(size_bau) num_block_align_units); 144 145 void HMM_UNIQUE(grow_chunk)( 146 HMM_UNIQUE(descriptor) *desc, void *end_of_chunk, 147 HMM_UNIQUE(size_bau) num_block_align_units); 148 149 /* NOT YET IMPLEMENTED */ 150 void HMM_UNIQUE(shrink_chunk)( 151 HMM_UNIQUE(descriptor) *desc, 152 HMM_UNIQUE(size_bau) num_block_align_units); 153 154 #endif /* defined HMM_PROCESS */ 155 #endif // VPX_MEM_MEMORY_MANAGER_INCLUDE_HEAPMM_H_ 156