/*
* 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_ */