added unbound to external deps
This commit is contained in:
Vendored
+150
@@ -0,0 +1,150 @@
|
||||
/*
|
||||
* regional.h -- region based memory allocator.
|
||||
*
|
||||
* Copyright (c) 2007, NLnet Labs. All rights reserved.
|
||||
*
|
||||
* This software is open source.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* Neither the name of the NLNET LABS nor the names of its contributors may
|
||||
* be used to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Regional allocator. Allocates small portions of of larger chunks.
|
||||
* Based on region-allocator from NSD, but rewritten to be light.
|
||||
*
|
||||
* Different from (nsd) region-allocator.h
|
||||
* o does not have recycle bin
|
||||
* o does not collect stats; just enough to answer get_mem() in use.
|
||||
* o does not keep cleanup list
|
||||
* o does not have function pointers to setup
|
||||
* o allocs the regional struct inside the first block.
|
||||
* o can take a block to create regional from.
|
||||
* o blocks and large allocations are kept on singly linked lists.
|
||||
*/
|
||||
|
||||
#ifndef UTIL_REGIONAL_H_
|
||||
#define UTIL_REGIONAL_H_
|
||||
|
||||
/**
|
||||
* the regional* is the first block*.
|
||||
* every block has a ptr to the next in first bytes.
|
||||
* and so does the regional struct, which is the first block.
|
||||
*/
|
||||
struct regional
|
||||
{
|
||||
/**
|
||||
* next chunk. NULL if first chunk is the only chunk.
|
||||
* first inside that chunk is the char* next pointer.
|
||||
* When regional_free_all() has been called this value is NULL.
|
||||
*/
|
||||
char* next;
|
||||
/** first large object, cast to char** to obtain next ptr */
|
||||
char* large_list;
|
||||
/** total large size */
|
||||
size_t total_large;
|
||||
/** initial chunk size */
|
||||
size_t first_size;
|
||||
/** number of bytes available in the current chunk. */
|
||||
size_t available;
|
||||
/** current chunk data position. */
|
||||
char* data;
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a new regional.
|
||||
* @return: newly allocated regional.
|
||||
*/
|
||||
struct regional* regional_create(void);
|
||||
|
||||
/**
|
||||
* Create a new region, with custom settings.
|
||||
* @param size: length of first block.
|
||||
* @return: newly allocated regional.
|
||||
*/
|
||||
struct regional* regional_create_custom(size_t size);
|
||||
|
||||
/**
|
||||
* Free all memory associated with regional. Only keeps the first block with
|
||||
* the regional inside it.
|
||||
* @param r: the region.
|
||||
*/
|
||||
void regional_free_all(struct regional *r);
|
||||
|
||||
/**
|
||||
* Destroy regional. All memory associated with regional is freed as if
|
||||
* regional_free_all was called, as well as destroying the regional struct.
|
||||
* @param r: to delete.
|
||||
*/
|
||||
void regional_destroy(struct regional *r);
|
||||
|
||||
/**
|
||||
* Allocate size bytes of memory inside regional. The memory is
|
||||
* deallocated when region_free_all is called for this region.
|
||||
* @param r: the region.
|
||||
* @param size: number of bytes.
|
||||
* @return: pointer to memory allocated.
|
||||
*/
|
||||
void *regional_alloc(struct regional *r, size_t size);
|
||||
|
||||
/**
|
||||
* Allocate size bytes of memory inside regional and copy INIT into it.
|
||||
* The memory is deallocated when region_free_all is called for this
|
||||
* region.
|
||||
* @param r: the region.
|
||||
* @param init: to copy.
|
||||
* @param size: number of bytes.
|
||||
* @return: pointer to memory allocated.
|
||||
*/
|
||||
void *regional_alloc_init(struct regional* r, const void *init, size_t size);
|
||||
|
||||
/**
|
||||
* Allocate size bytes of memory inside regional that are initialized to
|
||||
* 0. The memory is deallocated when region_free_all is called for
|
||||
* this region.
|
||||
* @param r: the region.
|
||||
* @param size: number of bytes.
|
||||
* @return: pointer to memory allocated.
|
||||
*/
|
||||
void *regional_alloc_zero(struct regional *r, size_t size);
|
||||
|
||||
/**
|
||||
* Duplicate string and allocate the result in regional.
|
||||
* @param r: the region.
|
||||
* @param string: null terminated string.
|
||||
* @return: pointer to memory allocated.
|
||||
*/
|
||||
char *regional_strdup(struct regional *r, const char *string);
|
||||
|
||||
/** Debug print regional statistics to log */
|
||||
void regional_log_stats(struct regional *r);
|
||||
|
||||
/** get total memory size in use by region */
|
||||
size_t regional_get_mem(struct regional* r);
|
||||
|
||||
#endif /* UTIL_REGIONAL_H_ */
|
||||
Reference in New Issue
Block a user