alloc.c File Reference

This file contains memory allocation functions. More...

#include "config.h"
#include "util/alloc.h"
#include "util/regional.h"
#include "util/data/packed_rrset.h"
#include "util/fptr_wlist.h"

Defines

#define ALLOC_REG_SIZE   16384
 custom size of cached regional blocks
#define THRNUM_SHIFT   48
 number of bits for ID part of uint64, rest for number of threads.

Functions

static void alloc_setup_special (alloc_special_t *t)
 setup new special type
static void prealloc (struct alloc_cache *alloc)
 prealloc some entries in the cache.
static void prealloc_blocks (struct alloc_cache *alloc, size_t num)
 prealloc region blocks
void alloc_init (struct alloc_cache *alloc, struct alloc_cache *super, int thread_num)
 Init alloc (zeroes the struct).
void alloc_clear (struct alloc_cache *alloc)
 Free the alloc.
uint64_t alloc_get_id (struct alloc_cache *alloc)
 Set ID number of special type to a fresh new ID number.
alloc_special_talloc_special_obtain (struct alloc_cache *alloc)
 Get a new special_t element.
static void pushintosuper (struct alloc_cache *alloc, alloc_special_t *mem)
 push mem and some more items to the super
void alloc_special_release (struct alloc_cache *alloc, alloc_special_t *mem)
 Return special_t back to pool.
void alloc_stats (struct alloc_cache *alloc)
 Print debug information (statistics).
size_t alloc_get_mem (struct alloc_cache *alloc)
 Get memory size of alloc cache, alloc structure including special types.
struct regionalalloc_reg_obtain (struct alloc_cache *alloc)
 Get a new regional for query states.
void alloc_reg_release (struct alloc_cache *alloc, struct regional *r)
 Put regional for query states back into alloc cache.
void alloc_set_id_cleanup (struct alloc_cache *alloc, void(*cleanup)(void *), void *arg)
 Set cleanup on ID overflow callback function.

Variables

size_t unbound_mem_alloc = 0
 global debug value to keep track of total memory mallocs
size_t unbound_mem_freed = 0
 global debug value to keep track of total memory frees

Detailed Description

This file contains memory allocation functions.


Define Documentation

#define THRNUM_SHIFT   48

number of bits for ID part of uint64, rest for number of threads.

Referenced by alloc_get_id(), and alloc_init().


Function Documentation

static void prealloc ( struct alloc_cache alloc  )  [static]

prealloc some entries in the cache.

To minimize contention. Result is 1 lock per alloc_max newly created entries.

Parameters:
alloc,: the structure to fill up.

References alloc_set_special_next, alloc_setup_special(), ALLOC_SPECIAL_MAX, log_err(), alloc_cache::num_quar, and alloc_cache::quar.

Referenced by alloc_special_obtain().

void alloc_init ( struct alloc_cache alloc,
struct alloc_cache super,
int  thread_num 
)

Init alloc (zeroes the struct).

Parameters:
alloc,: this parameter is allocated by the caller.
super,: super to use (init that before with super_init). Pass this argument NULL to init the toplevel alloc structure.
thread_num,: thread number for id creation of special type.

References alloc_cache::cleanup, alloc_cache::cleanup_arg, alloc_cache::last_id, alloc_cache::lock, alloc_cache::max_reg_blocks, alloc_cache::next_id, alloc_cache::num_reg_blocks, prealloc_blocks(), alloc_cache::reg_list, alloc_cache::super, alloc_cache::thread_num, and THRNUM_SHIFT.

Referenced by alloc_test(), context_obtain_alloc(), daemon_init(), dstest_file(), msgparse_test(), nsec3_hash_test(), ub_ctx_create(), verifytest_file(), and worker_init().

void alloc_clear ( struct alloc_cache alloc  ) 

Free the alloc.

Pushes all the cached items into the super structure. Or deletes them if alloc->super is NULL. Does not free the alloc struct itself (it was also allocated by caller).

Parameters:
alloc,: is almost zeroed on exit (except some stats).

References alloc_set_special_next, alloc_special_next, ub_packed_rrset_key::entry, lruhash_entry::lock, alloc_cache::lock, regional::next, alloc_cache::num_quar, alloc_cache::num_reg_blocks, alloc_cache::quar, alloc_cache::reg_list, and alloc_cache::super.

Referenced by alloc_test(), daemon_delete(), dstest_file(), msgparse_test(), nsec3_hash_test(), ub_ctx_delete(), verifytest_file(), and worker_delete().

uint64_t alloc_get_id ( struct alloc_cache alloc  ) 

Set ID number of special type to a fresh new ID number.

In case of ID number overflow, the rrset cache has to be cleared.

Parameters:
alloc,: the alloc cache
Returns:
: fresh id is returned.

References alloc_cache::cleanup, alloc_cache::cleanup_arg, fptr_ok, fptr_whitelist_alloc_cleanup(), alloc_cache::last_id, log_warn(), alloc_cache::next_id, alloc_cache::thread_num, and THRNUM_SHIFT.

Referenced by alloc_special_obtain(), and rrset_update_id().

alloc_special_t* alloc_special_obtain ( struct alloc_cache alloc  ) 

Get a new special_t element.

Parameters:
alloc,: where to alloc it.
Returns:
: memory block. Will not return NULL (instead fatal_exit). The block is zeroed.

References alloc_get_id(), alloc_setup_special(), alloc_special_next, fatal_exit(), ub_packed_rrset_key::id, alloc_cache::lock, log_assert, alloc_cache::num_quar, prealloc(), alloc_cache::quar, and alloc_cache::super.

Referenced by alloc_test(), move_into_cache(), packed_rrset_copy_alloc(), repinfo_alloc_rrset_keys(), and store_rrset().

void alloc_special_release ( struct alloc_cache alloc,
alloc_special_t mem 
)

Return special_t back to pool.

The block is cleaned up (zeroed) which also invalidates the ID inside.

Parameters:
alloc,: where to alloc it.
mem,: block to free.

References alloc_set_special_next, alloc_special_clean, ALLOC_SPECIAL_MAX, alloc_cache::lock, log_assert, alloc_cache::num_quar, pushintosuper(), alloc_cache::quar, and alloc_cache::super.

Referenced by alloc_test(), packed_rrset_copy_alloc(), store_rrset(), ub_packed_rrset_parsedelete(), and ub_rrset_key_delete().

void alloc_stats ( struct alloc_cache alloc  ) 

Print debug information (statistics).

Parameters:
alloc,: on what alloc.

References log_info(), alloc_cache::num_quar, alloc_cache::num_reg_blocks, and alloc_cache::super.

Referenced by alloc_test().

size_t alloc_get_mem ( struct alloc_cache alloc  ) 

Get memory size of alloc cache, alloc structure including special types.

Parameters:
alloc,: on what alloc.
Returns:
size in bytes.

References ALLOC_REG_SIZE, alloc_special_next, ub_packed_rrset_key::entry, lruhash_entry::lock, alloc_cache::lock, alloc_cache::num_quar, alloc_cache::num_reg_blocks, alloc_cache::quar, and alloc_cache::super.

Referenced by worker_mem_report().

struct regional* alloc_reg_obtain ( struct alloc_cache alloc  )  [read]

Get a new regional for query states.

Parameters:
alloc,: where to alloc it.
Returns:
regional for use or NULL on alloc failure.

References ALLOC_REG_SIZE, regional::next, alloc_cache::num_reg_blocks, alloc_cache::reg_list, and regional_create_custom().

Referenced by mesh_state_create().

void alloc_reg_release ( struct alloc_cache alloc,
struct regional r 
)

Put regional for query states back into alloc cache.

Parameters:
alloc,: where to alloc it.
r,: regional to put back.

References log_assert, alloc_cache::max_reg_blocks, regional::next, alloc_cache::num_reg_blocks, alloc_cache::reg_list, regional_destroy(), and regional_free_all().

Referenced by mesh_state_cleanup(), and mesh_state_create().

void alloc_set_id_cleanup ( struct alloc_cache alloc,
void(*)(void *)  cleanup,
void *  arg 
)

Set cleanup on ID overflow callback function.

This should remove all RRset ID references from the program. Clear the caches.

Parameters:
alloc,: the alloc
cleanup,: the callback function, called as cleanup(arg).
arg,: user argument to callback function.

References alloc_cache::cleanup, and alloc_cache::cleanup_arg.

Referenced by libworker_setup(), and worker_init().

Generated on Thu Apr 22 00:30:18 2010 for unbound by  doxygen 1.6.3