regional.c File Reference

Regional allocator. More...

#include "config.h"
#include "util/log.h"
#include "util/regional.h"

Macros

#define ALIGN_UP(x, s)   (((x) + s - 1) & (~(s - 1)))
 increase size until it fits alignment of s bytes
 
#define ALIGNMENT   (sizeof(uint64_t))
 what size to align on; make sure a char* fits in it.
 
#define REGIONAL_CHUNK_SIZE   8192
 Default reasonable size for chunks.
 
#define REGIONAL_LARGE_OBJECT_SIZE   2048
 Default size for large objects - allocated outside of chunks.
 

Functions

struct regionalregional_create (void)
 Create a new regional. More...
 
static void regional_init (struct regional *r)
 init regional struct with first block
 
static struct regionalregional_create_custom_large_object (size_t size, size_t large_object_size)
 Create a new region, with custom first block and large-object sizes. More...
 
struct regionalregional_create_custom (size_t size)
 Create a new region, with custom settings. More...
 
struct regionalregional_create_nochunk (size_t size)
 Create a new region, with custom settings, that will allocate everything outside the region chunk. More...
 
void regional_free_all (struct regional *r)
 Free all memory associated with regional. More...
 
void regional_destroy (struct regional *r)
 Destroy regional. More...
 
void * regional_alloc (struct regional *r, size_t size)
 Allocate size bytes of memory inside regional. More...
 
void * regional_alloc_init (struct regional *r, const void *init, size_t size)
 Allocate size bytes of memory inside regional and copy INIT into it. More...
 
void * regional_alloc_zero (struct regional *r, size_t size)
 Allocate size bytes of memory inside regional that are initialized to 0. More...
 
char * regional_strdup (struct regional *r, const char *string)
 Duplicate string and allocate the result in regional. More...
 
static size_t count_chunks (struct regional *r)
 reasonably slow, but stats and get_mem are not supposed to be fast count the number of chunks in use
 
static size_t count_large (struct regional *r)
 also reasonably slow, counts the number of large objects
 
void regional_log_stats (struct regional *r)
 Debug print regional statistics to log.
 
size_t regional_get_mem (struct regional *r)
 get total memory size in use by region
 

Detailed Description

Regional allocator.

Allocates small portions of of larger chunks.

Function Documentation

◆ regional_create()

◆ regional_create_custom_large_object()

static struct regional* regional_create_custom_large_object ( size_t  size,
size_t  large_object_size 
)
static

Create a new region, with custom first block and large-object sizes.

Parameters
sizelength of first block.
large_object_sizeoutside of chunk allocation threshold.
Returns
: newly allocated regional.

References ALIGN_UP, ALIGNMENT, regional::first_size, regional::large_object_size, log_assert, and regional_init().

Referenced by regional_create_custom(), and regional_create_nochunk().

◆ regional_create_custom()

struct regional* regional_create_custom ( size_t  size)

Create a new region, with custom settings.

Parameters
sizelength of first block.
Returns
: newly allocated regional.

References regional_create_custom_large_object(), and REGIONAL_LARGE_OBJECT_SIZE.

Referenced by alloc_reg_obtain(), burden_test(), libworker_setup(), prealloc_blocks(), regional_create(), rpz_create(), and specific_cases().

◆ regional_create_nochunk()

struct regional* regional_create_nochunk ( size_t  size)

Create a new region, with custom settings, that will allocate everything outside the region chunk.

Parameters
sizelength of first block.
Returns
: newly allocated regional.

References regional_create_custom_large_object().

Referenced by local_zone_create().

◆ regional_free_all()

◆ regional_destroy()

void regional_destroy ( 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.

Parameters
rto delete.

References regional_free_all().

Referenced by acl_list_delete(), alloc_reg_release(), burden_test(), check_az_q_ans(), donotq_delete(), edns_strings_delete(), libworker_delete_env(), local_zone_delete(), priv_delete(), respip_set_delete(), specific_cases(), worker_delete(), zonemd_generate_test(), and zonemd_offline_verify().

◆ regional_alloc()

void* regional_alloc ( struct regional r,
size_t  size 
)

Allocate size bytes of memory inside regional.

The memory is deallocated when region_free_all is called for this region.

Parameters
rthe region.
sizenumber of bytes.
Returns
: pointer to memory allocated.

References ALIGN_UP, ALIGNMENT, regional::available, regional::data, regional::large_list, regional::large_object_size, regional::next, REGIONAL_CHUNK_SIZE, and regional::total_large.

Referenced by burden_test(), compress_tree_newnode(), construct_reply_info_base(), createResponse(), delegpt_add_addr(), delegpt_add_ns(), delegpt_create(), dns64_adjust_a(), dns64_adjust_ptr(), dns64_inform_super(), dns64_operate(), dns_alloc_msg(), dns_copy_msg(), dns_msg_create(), donotq_insert(), edns_opt_list_append(), edns_opt_list_append_ede(), gen_dns_msg(), generate_sub_request(), iter_add_prepend_answer(), iter_add_prepend_auth(), iter_new(), iter_prepend(), iter_store_parentside_neg(), key_entry_get_rrset(), key_entry_setup(), libworker_send_query(), mesh_state_add_cb(), mesh_state_add_reply(), mesh_state_attachment(), mesh_state_create(), moveover_rrsigs(), msg_create(), new_rrset(), nsec3_cache_table_init(), nsec3_calc_hash(), nsec3_ce_wildcard(), nsec3_hash_name(), outnet_serviced_query(), packed_rrset_copy_region(), parse_copy_decompress_rrset(), parse_create_qinfo(), parse_reply_in_temp_region(), read_addrs(), read_names(), regional_alloc_zero(), reply_info_alloc_rrset_keys(), reply_info_copy(), reply_info_parse(), respip_copy_rrset(), rrset_array_unlock_touch(), rrset_canonical(), rrset_canonical_equal(), rrset_canonicalize_to_buffer(), sock_list_insert(), synth_cname_rrset(), val_new(), worker_send_query(), and zonemd_simple_rrsig_allocs().

◆ regional_alloc_init()

void* regional_alloc_init ( struct regional r,
const void *  init,
size_t  size 
)

◆ regional_alloc_zero()

void* regional_alloc_zero ( struct regional r,
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.

Parameters
rthe region.
sizenumber of bytes.
Returns
: pointer to memory allocated.

References regional_alloc().

Referenced by acl_list_insert(), auth_zone_delegpt(), cfg_region_strlist_insert(), dns_msg_create(), get_rrset_trust(), iter_store_parentside_neg(), load_rrset(), local_data_find_tag_datas(), lz_enter_override(), lz_find_create_node(), mesh_serve_expired_init(), mesh_state_add_reply(), msg_create(), msg_grow_array(), new_cname_override(), new_local_rrset(), new_rrset(), respip_copy_rrset(), respip_operate(), respip_sockaddr_find_or_create(), rpz_add_soa(), and tcl_list_insert().

◆ regional_strdup()

char* regional_strdup ( struct regional r,
const char *  string 
)

Duplicate string and allocate the result in regional.

Parameters
rthe region.
stringnull terminated string.
Returns
: pointer to memory allocated.

References regional_alloc_init().

Referenced by algo_needs_reason(), delegpt_add_addr(), delegpt_add_ns(), dns_msg_deepcopy_region(), key_entry_copy_toregion(), key_entry_create_bad(), key_entry_create_null(), key_entry_create_rrset(), and serviced_create().