alloc.h File Reference

This file contains memory allocation functions. More...

#include "util/locks.h"

Data Structures

struct  alloc_cache
 Structure that provides allocation. More...
 

Macros

#define alloc_special_clean(x)   (x)->id = 0;
 clean the special type. More...
 
#define alloc_special_next(x)   ((alloc_special_type*)((x)->entry.overflow_next))
 access next pointer. More...
 
#define alloc_set_special_next(x, y)    ((x)->entry.overflow_next) = (struct lruhash_entry*)(y);
 set next pointer. More...
 
#define ALLOC_SPECIAL_MAX   10
 how many blocks to cache locally.
 

Typedefs

typedef struct ub_packed_rrset_key alloc_special_type
 The special type, packed rrset. More...
 

Functions

void alloc_init (struct alloc_cache *alloc, struct alloc_cache *super, int thread_num)
 Init alloc (zeroes the struct). More...
 
void alloc_clear (struct alloc_cache *alloc)
 Free the alloc. More...
 
void alloc_clear_special (struct alloc_cache *alloc)
 Free the special alloced items. More...
 
alloc_special_typealloc_special_obtain (struct alloc_cache *alloc)
 Get a new special_type element. More...
 
void alloc_special_release (struct alloc_cache *alloc, alloc_special_type *mem)
 Return special_type back to pool. More...
 
uint64_t alloc_get_id (struct alloc_cache *alloc)
 Set ID number of special type to a fresh new ID number. More...
 
size_t alloc_get_mem (struct alloc_cache *alloc)
 Get memory size of alloc cache, alloc structure including special types. More...
 
void alloc_stats (struct alloc_cache *alloc)
 Print debug information (statistics). More...
 
struct regionalalloc_reg_obtain (struct alloc_cache *alloc)
 Get a new regional for query states. More...
 
void alloc_reg_release (struct alloc_cache *alloc, struct regional *r)
 Put regional for query states back into alloc cache. More...
 
void alloc_set_id_cleanup (struct alloc_cache *alloc, void(*cleanup)(void *), void *arg)
 Set cleanup on ID overflow callback function. More...
 

Detailed Description

This file contains memory allocation functions.

The reasons for this service are: o Avoid locking costs of getting global lock to call malloc(). o The packed rrset type needs to be kept on special freelists, so that they are reused for other packet rrset allocations.

Macro Definition Documentation

◆ alloc_special_clean

#define alloc_special_clean (   x)    (x)->id = 0;

clean the special type.

Pass pointer.

◆ alloc_special_next

#define alloc_special_next (   x)    ((alloc_special_type*)((x)->entry.overflow_next))

access next pointer.

(in available spot). Pass pointer.

◆ alloc_set_special_next

#define alloc_set_special_next (   x,
 
)     ((x)->entry.overflow_next) = (struct lruhash_entry*)(y);

set next pointer.

(in available spot). Pass pointers.

Typedef Documentation

◆ alloc_special_type

The special type, packed rrset.

Not allowed to be used for other memory

Function Documentation

◆ alloc_init()

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

Init alloc (zeroes the struct).

Parameters
allocthis parameter is allocated by the caller.
supersuper to use (init that before with super_init). Pass this argument NULL to init the toplevel alloc structure.
thread_numthread 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(), msgparse_test(), and ub_ctx_create_nopipe().

◆ alloc_clear()

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
allocis almost zeroed on exit (except some stats).

References alloc_clear_special_list(), alloc_set_special_next, alloc_special_next, 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_clear_allocs(), and daemon_delete().

◆ alloc_clear_special()

void alloc_clear_special ( struct alloc_cache alloc)

Free the special alloced items.

The rrset and message caches must be empty, there must be no more references to rrset pointers into the rrset cache.

Parameters
allocthe special allocs are freed.

References alloc_clear_special_list(), alloc_cache::lock, alloc_cache::num_quar, alloc_cache::quar, and alloc_cache::super.

Referenced by daemon_clear_allocs().

◆ alloc_special_obtain()

alloc_special_type* alloc_special_obtain ( struct alloc_cache alloc)

Get a new special_type element.

Parameters
allocwhere 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, ub_packed_rrset_key::id, alloc_cache::lock, log_assert, log_err(), alloc_cache::num_quar, prealloc_setup(), alloc_cache::quar, and alloc_cache::super.

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

◆ alloc_special_release()

void alloc_special_release ( struct alloc_cache alloc,
alloc_special_type mem 
)

Return special_type back to pool.

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

Parameters
allocwhere to alloc it.
memblock 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(), rrset_cache_update_wildcard(), store_rrset(), ub_packed_rrset_parsedelete(), and ub_rrset_key_delete().

◆ alloc_get_id()

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
allocthe 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_get_mem()

size_t alloc_get_mem ( struct alloc_cache alloc)

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

Parameters
allocon what alloc.
Returns
size in bytes.

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

◆ alloc_stats()

void alloc_stats ( struct alloc_cache alloc)

Print debug information (statistics).

Parameters
allocon what alloc.

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

Referenced by alloc_test().

◆ alloc_reg_obtain()

struct regional* alloc_reg_obtain ( struct alloc_cache alloc)

Get a new regional for query states.

Parameters
allocwhere 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(), and outnet_serviced_query().

◆ alloc_reg_release()

void alloc_reg_release ( struct alloc_cache alloc,
struct regional r 
)

Put regional for query states back into alloc cache.

Parameters
allocwhere to alloc it.
rregional 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_create(), outnet_serviced_query(), and serviced_create().

◆ alloc_set_id_cleanup()

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
allocthe alloc
cleanupthe callback function, called as cleanup(arg).
arguser argument to callback function.

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

Referenced by libworker_setup().