xref: /freebsd/contrib/unbound/util/regional.h (revision 369c692350f53cc5abd8e3056ad3d80c2155820e)
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