Generic radix trees/sparse arrays¶
Very simple and minimalistic, supporting arbitrary size entries up to GENRADIX_NODE_SIZE.
A genradix is defined with the type it will store, like so:
static GENRADIX(struct foo) foo_genradix;
The main operations are:
genradix_init(radix) - initialize an empty genradix
genradix_free(radix) - free all memory owned by the genradix and reinitialize it
genradix_ptr(radix, idx) - gets a pointer to the entry at idx, returning NULL if that entry does not exist
genradix_ptr_alloc(radix, idx, gfp) - gets a pointer to an entry, allocating it if necessary
genradix_for_each(radix, iter, p) - iterate over each entry in a genradix
The radix tree allocates one page of entries at a time, so entries may exist that were never explicitly allocated - they will be initialized to all zeroes.
Internally, a genradix is just a radix tree of pages, and indexing works in terms of byte offsets. The wrappers in this header file use sizeof on the type the radix contains to calculate a byte offset from the index - see __idx_to_offset.
generic radix tree functions¶
-
genradix_init¶
genradix_init (_radix)
initialize a genradix
Parameters
_radix
genradix to initialize
Description
Does not fail
-
genradix_free¶
genradix_free (_radix)
free all memory owned by a genradix
Parameters
_radix
the genradix to free
Description
After freeing, _radix will be reinitialized and empty
-
genradix_ptr¶
genradix_ptr (_radix, _idx)
get a pointer to a genradix entry
Parameters
_radix
genradix to access
_idx
index to fetch
Description
Returns a pointer to entry at _idx, or NULL if that entry does not exist.
-
genradix_ptr_alloc¶
genradix_ptr_alloc (_radix, _idx, _gfp)
get a pointer to a genradix entry, allocating it if necessary
Parameters
_radix
genradix to access
_idx
index to fetch
_gfp
gfp mask
Description
Returns a pointer to entry at _idx, or NULL on allocation failure
-
genradix_iter_init¶
genradix_iter_init (_radix, _idx)
initialize a genradix_iter
Parameters
_radix
genradix that will be iterated over
_idx
index to start iterating from
-
genradix_iter_peek¶
genradix_iter_peek (_iter, _radix)
get first entry at or above iterator’s current position
Parameters
_iter
a genradix_iter
_radix
genradix being iterated over
Description
If no more entries exist at or above _iter’s current position, returns NULL
-
genradix_iter_peek_prev¶
genradix_iter_peek_prev (_iter, _radix)
get first entry at or below iterator’s current position
Parameters
_iter
a genradix_iter
_radix
genradix being iterated over
Description
If no more entries exist at or below _iter’s current position, returns NULL
-
genradix_for_each¶
genradix_for_each (_radix, _iter, _p)
iterate over entry in a genradix
Parameters
_radix
genradix to iterate over
_iter
a genradix_iter to track current position
_p
pointer to genradix entry type
Description
On every iteration, _p will point to the current entry, and _iter.pos will be the current entry’s index.
-
genradix_for_each_reverse¶
genradix_for_each_reverse (_radix, _iter, _p)
iterate over entry in a genradix, reverse order
Parameters
_radix
genradix to iterate over
_iter
a genradix_iter to track current position
_p
pointer to genradix entry type
Description
On every iteration, _p will point to the current entry, and _iter.pos will be the current entry’s index.
-
genradix_prealloc¶
genradix_prealloc (_radix, _nr, _gfp)
preallocate entries in a generic radix tree
Parameters
_radix
genradix to preallocate
_nr
number of entries to preallocate
_gfp
gfp mask
Description
Returns 0 on success, -ENOMEM on failure