1b7579f77SDag-Erling Smørgrav /* 2b7579f77SDag-Erling Smørgrav * regional.h -- region based memory allocator. 3b7579f77SDag-Erling Smørgrav * 4b7579f77SDag-Erling Smørgrav * Copyright (c) 2007, NLnet Labs. All rights reserved. 5b7579f77SDag-Erling Smørgrav * 6b7579f77SDag-Erling Smørgrav * This software is open source. 7b7579f77SDag-Erling Smørgrav * 8b7579f77SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 9b7579f77SDag-Erling Smørgrav * modification, are permitted provided that the following conditions 10b7579f77SDag-Erling Smørgrav * are met: 11b7579f77SDag-Erling Smørgrav * 12b7579f77SDag-Erling Smørgrav * Redistributions of source code must retain the above copyright notice, 13b7579f77SDag-Erling Smørgrav * this list of conditions and the following disclaimer. 14b7579f77SDag-Erling Smørgrav * 15b7579f77SDag-Erling Smørgrav * Redistributions in binary form must reproduce the above copyright notice, 16b7579f77SDag-Erling Smørgrav * this list of conditions and the following disclaimer in the documentation 17b7579f77SDag-Erling Smørgrav * and/or other materials provided with the distribution. 18b7579f77SDag-Erling Smørgrav * 19b7579f77SDag-Erling Smørgrav * Neither the name of the NLNET LABS nor the names of its contributors may 20b7579f77SDag-Erling Smørgrav * be used to endorse or promote products derived from this software without 21b7579f77SDag-Erling Smørgrav * specific prior written permission. 22b7579f77SDag-Erling Smørgrav * 23b7579f77SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2417d15b25SDag-Erling Smørgrav * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2517d15b25SDag-Erling Smørgrav * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2617d15b25SDag-Erling Smørgrav * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2717d15b25SDag-Erling Smørgrav * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2817d15b25SDag-Erling Smørgrav * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 2917d15b25SDag-Erling Smørgrav * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 3017d15b25SDag-Erling Smørgrav * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 3117d15b25SDag-Erling Smørgrav * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 3217d15b25SDag-Erling Smørgrav * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3317d15b25SDag-Erling Smørgrav * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34b7579f77SDag-Erling Smørgrav */ 35b7579f77SDag-Erling Smørgrav 36b7579f77SDag-Erling Smørgrav /** 37b7579f77SDag-Erling Smørgrav * \file 38b7579f77SDag-Erling Smørgrav * Regional allocator. Allocates small portions of of larger chunks. 39b7579f77SDag-Erling Smørgrav * Based on region-allocator from NSD, but rewritten to be light. 40b7579f77SDag-Erling Smørgrav * 41b7579f77SDag-Erling Smørgrav * Different from (nsd) region-allocator.h 42b7579f77SDag-Erling Smørgrav * o does not have recycle bin 43b7579f77SDag-Erling Smørgrav * o does not collect stats; just enough to answer get_mem() in use. 44b7579f77SDag-Erling Smørgrav * o does not keep cleanup list 45b7579f77SDag-Erling Smørgrav * o does not have function pointers to setup 46b7579f77SDag-Erling Smørgrav * o allocs the regional struct inside the first block. 47b7579f77SDag-Erling Smørgrav * o can take a block to create regional from. 48b7579f77SDag-Erling Smørgrav * o blocks and large allocations are kept on singly linked lists. 49b7579f77SDag-Erling Smørgrav */ 50b7579f77SDag-Erling Smørgrav 51b7579f77SDag-Erling Smørgrav #ifndef UTIL_REGIONAL_H_ 52b7579f77SDag-Erling Smørgrav #define UTIL_REGIONAL_H_ 53b7579f77SDag-Erling Smørgrav 54b7579f77SDag-Erling Smørgrav /** 55b7579f77SDag-Erling Smørgrav * the regional* is the first block*. 56b7579f77SDag-Erling Smørgrav * every block has a ptr to the next in first bytes. 57b7579f77SDag-Erling Smørgrav * and so does the regional struct, which is the first block. 58b7579f77SDag-Erling Smørgrav */ 59b7579f77SDag-Erling Smørgrav struct regional 60b7579f77SDag-Erling Smørgrav { 61b7579f77SDag-Erling Smørgrav /** 62b7579f77SDag-Erling Smørgrav * next chunk. NULL if first chunk is the only chunk. 63b7579f77SDag-Erling Smørgrav * first inside that chunk is the char* next pointer. 64b7579f77SDag-Erling Smørgrav * When regional_free_all() has been called this value is NULL. 65b7579f77SDag-Erling Smørgrav */ 66b7579f77SDag-Erling Smørgrav char* next; 67b7579f77SDag-Erling Smørgrav /** first large object, cast to char** to obtain next ptr */ 68b7579f77SDag-Erling Smørgrav char* large_list; 69b7579f77SDag-Erling Smørgrav /** total large size */ 70b7579f77SDag-Erling Smørgrav size_t total_large; 71b7579f77SDag-Erling Smørgrav /** initial chunk size */ 72b7579f77SDag-Erling Smørgrav size_t first_size; 73b7579f77SDag-Erling Smørgrav /** number of bytes available in the current chunk. */ 74b7579f77SDag-Erling Smørgrav size_t available; 75b7579f77SDag-Erling Smørgrav /** current chunk data position. */ 76b7579f77SDag-Erling Smørgrav char* data; 77*369c6923SCy Schubert /** threshold for outside of chunk allocations */ 78*369c6923SCy Schubert size_t large_object_size; 79*369c6923SCy Schubert /** padding for sizeof8 alignment of sizeof(struct regional) 80*369c6923SCy Schubert * for 32bit systems */ 81*369c6923SCy Schubert size_t padding; 82b7579f77SDag-Erling Smørgrav }; 83b7579f77SDag-Erling Smørgrav 84b7579f77SDag-Erling Smørgrav /** 85b7579f77SDag-Erling Smørgrav * Create a new regional. 86b7579f77SDag-Erling Smørgrav * @return: newly allocated regional. 87b7579f77SDag-Erling Smørgrav */ 88b7579f77SDag-Erling Smørgrav struct regional* regional_create(void); 89b7579f77SDag-Erling Smørgrav 90b7579f77SDag-Erling Smørgrav /** 91b7579f77SDag-Erling Smørgrav * Create a new region, with custom settings. 92b7579f77SDag-Erling Smørgrav * @param size: length of first block. 93b7579f77SDag-Erling Smørgrav * @return: newly allocated regional. 94b7579f77SDag-Erling Smørgrav */ 95b7579f77SDag-Erling Smørgrav struct regional* regional_create_custom(size_t size); 96b7579f77SDag-Erling Smørgrav 97b7579f77SDag-Erling Smørgrav /** 98*369c6923SCy Schubert * Create a new region, with custom settings, that will allocate everything 99*369c6923SCy Schubert * outside the region chunk. 100*369c6923SCy Schubert * @param size: length of first block. 101*369c6923SCy Schubert * @return: newly allocated regional. 102*369c6923SCy Schubert */ 103*369c6923SCy Schubert struct regional* regional_create_nochunk(size_t size); 104*369c6923SCy Schubert 105*369c6923SCy Schubert /** 106b7579f77SDag-Erling Smørgrav * Free all memory associated with regional. Only keeps the first block with 107b7579f77SDag-Erling Smørgrav * the regional inside it. 108b7579f77SDag-Erling Smørgrav * @param r: the region. 109b7579f77SDag-Erling Smørgrav */ 110b7579f77SDag-Erling Smørgrav void regional_free_all(struct regional *r); 111b7579f77SDag-Erling Smørgrav 112b7579f77SDag-Erling Smørgrav /** 113b7579f77SDag-Erling Smørgrav * Destroy regional. All memory associated with regional is freed as if 114b7579f77SDag-Erling Smørgrav * regional_free_all was called, as well as destroying the regional struct. 115b7579f77SDag-Erling Smørgrav * @param r: to delete. 116b7579f77SDag-Erling Smørgrav */ 117b7579f77SDag-Erling Smørgrav void regional_destroy(struct regional *r); 118b7579f77SDag-Erling Smørgrav 119b7579f77SDag-Erling Smørgrav /** 120b7579f77SDag-Erling Smørgrav * Allocate size bytes of memory inside regional. The memory is 121b7579f77SDag-Erling Smørgrav * deallocated when region_free_all is called for this region. 122b7579f77SDag-Erling Smørgrav * @param r: the region. 123b7579f77SDag-Erling Smørgrav * @param size: number of bytes. 124b7579f77SDag-Erling Smørgrav * @return: pointer to memory allocated. 125b7579f77SDag-Erling Smørgrav */ 126b7579f77SDag-Erling Smørgrav void *regional_alloc(struct regional *r, size_t size); 127b7579f77SDag-Erling Smørgrav 128b7579f77SDag-Erling Smørgrav /** 129b7579f77SDag-Erling Smørgrav * Allocate size bytes of memory inside regional and copy INIT into it. 130b7579f77SDag-Erling Smørgrav * The memory is deallocated when region_free_all is called for this 131b7579f77SDag-Erling Smørgrav * region. 132b7579f77SDag-Erling Smørgrav * @param r: the region. 133b7579f77SDag-Erling Smørgrav * @param init: to copy. 134b7579f77SDag-Erling Smørgrav * @param size: number of bytes. 135b7579f77SDag-Erling Smørgrav * @return: pointer to memory allocated. 136b7579f77SDag-Erling Smørgrav */ 137b7579f77SDag-Erling Smørgrav void *regional_alloc_init(struct regional* r, const void *init, size_t size); 138b7579f77SDag-Erling Smørgrav 139b7579f77SDag-Erling Smørgrav /** 140b7579f77SDag-Erling Smørgrav * Allocate size bytes of memory inside regional that are initialized to 141b7579f77SDag-Erling Smørgrav * 0. The memory is deallocated when region_free_all is called for 142b7579f77SDag-Erling Smørgrav * this region. 143b7579f77SDag-Erling Smørgrav * @param r: the region. 144b7579f77SDag-Erling Smørgrav * @param size: number of bytes. 145b7579f77SDag-Erling Smørgrav * @return: pointer to memory allocated. 146b7579f77SDag-Erling Smørgrav */ 147b7579f77SDag-Erling Smørgrav void *regional_alloc_zero(struct regional *r, size_t size); 148b7579f77SDag-Erling Smørgrav 149b7579f77SDag-Erling Smørgrav /** 150b7579f77SDag-Erling Smørgrav * Duplicate string and allocate the result in regional. 151b7579f77SDag-Erling Smørgrav * @param r: the region. 152b7579f77SDag-Erling Smørgrav * @param string: null terminated string. 153b7579f77SDag-Erling Smørgrav * @return: pointer to memory allocated. 154b7579f77SDag-Erling Smørgrav */ 155b7579f77SDag-Erling Smørgrav char *regional_strdup(struct regional *r, const char *string); 156b7579f77SDag-Erling Smørgrav 157b7579f77SDag-Erling Smørgrav /** Debug print regional statistics to log */ 158b7579f77SDag-Erling Smørgrav void regional_log_stats(struct regional *r); 159b7579f77SDag-Erling Smørgrav 160b7579f77SDag-Erling Smørgrav /** get total memory size in use by region */ 161b7579f77SDag-Erling Smørgrav size_t regional_get_mem(struct regional* r); 162b7579f77SDag-Erling Smørgrav 163b7579f77SDag-Erling Smørgrav #endif /* UTIL_REGIONAL_H_ */ 164