Blender V5.0
BLI_memiter.cc File Reference
#include <cstdlib>
#include <cstring>
#include "BLI_asan.h"
#include "BLI_utildefines.h"
#include "BLI_memiter.h"
#include "MEM_guardedalloc.h"
#include "BLI_strict_flags.h"

Go to the source code of this file.

Classes

struct  BLI_memiter_elem
struct  BLI_memiter_chunk
struct  BLI_memiter

Macros

#define PADUP(num, pad)

Typedefs

using data_t = uintptr_t
using offset_t = intptr_t

Functions

BLI_INLINE uint data_offset_from_size (uint size)
static void memiter_set_rewind_offset (BLI_memiter *mi)
static void memiter_init (BLI_memiter *mi)
Public API's
BLI_memiterBLI_memiter_create (uint chunk_size_min)
void * BLI_memiter_alloc (BLI_memiter *mi, uint elem_size)
void * BLI_memiter_calloc (BLI_memiter *mi, uint elem_size)
void BLI_memiter_alloc_from (BLI_memiter *mi, uint elem_size, const void *data_from)
static void memiter_free_data (BLI_memiter *mi)
void BLI_memiter_destroy (BLI_memiter *mi)
void BLI_memiter_clear (BLI_memiter *mi)
uint BLI_memiter_count (const BLI_memiter *mi)
Helper API's
void * BLI_memiter_elem_first (BLI_memiter *mi)
void * BLI_memiter_elem_first_size (BLI_memiter *mi, uint *r_size)
Iterator API's
Note
We could loop over elements until a nullptr chunk is found, however this means every allocation needs to preemptively run memiter_set_rewind_offset (see #USE_TERMINATE_PARANOID). Unless we have a call to finalize allocation (which complicates usage). So use a counter instead.
void BLI_memiter_iter_init (BLI_memiter *mi, BLI_memiter_handle *iter)
bool BLI_memiter_iter_done (const BLI_memiter_handle *iter)
BLI_INLINE void memiter_chunk_step (BLI_memiter_handle *iter)
void * BLI_memiter_iter_step_size (BLI_memiter_handle *iter, uint *r_size)
void * BLI_memiter_iter_step (BLI_memiter_handle *iter)

Detailed Description

Simple, fast memory allocator for allocating many small elements of different sizes in fixed size memory chunks, although allocations bigger than the chunk size are supported. They will reduce the efficiency of this data-structure. Elements are pointer aligned.

Supports:

  • Allocation of mixed sizes.
  • Iterating over allocations in-order.
  • Clearing for re-use.

Unsupported:

  • Freeing individual elements.
Note
We could inline iteration stepping, but tests show this doesn't give noticeable speedup.

Definition in file BLI_memiter.cc.

Macro Definition Documentation

◆ PADUP

#define PADUP ( num,
pad )
Value:
(((num) + ((pad) - 1)) & ~((pad) - 1))
ATTR_WARN_UNUSED_RESULT const size_t num
int pad[32 - sizeof(int)]

Definition at line 53 of file BLI_memiter.cc.

Referenced by data_offset_from_size().

Typedef Documentation

◆ data_t

using data_t = uintptr_t

Definition at line 42 of file BLI_memiter.cc.

◆ offset_t

using offset_t = intptr_t

Definition at line 43 of file BLI_memiter.cc.

Function Documentation

◆ BLI_memiter_alloc()

◆ BLI_memiter_alloc_from()

void BLI_memiter_alloc_from ( BLI_memiter * mi,
uint elem_size,
const void * data_from )

Definition at line 200 of file BLI_memiter.cc.

References BLI_memiter_alloc(), and data.

◆ BLI_memiter_calloc()

void * BLI_memiter_calloc ( BLI_memiter * mi,
uint elem_size )

Definition at line 193 of file BLI_memiter.cc.

References BLI_memiter_alloc(), and data.

◆ BLI_memiter_clear()

void BLI_memiter_clear ( BLI_memiter * mi)

Definition at line 226 of file BLI_memiter.cc.

References memiter_free_data(), and memiter_init().

◆ BLI_memiter_count()

uint BLI_memiter_count ( const BLI_memiter * mi)

Definition at line 232 of file BLI_memiter.cc.

References BLI_memiter::count.

◆ BLI_memiter_create()

BLI_memiter * BLI_memiter_create ( unsigned int chunk_size_min)
Parameters
chunk_size_minShould be a power of two and significantly larger than the average element size used.

While allocations of any size are supported, they won't be efficient (effectively becoming a single-linked list).

Its intended that many elements can be stored per chunk.

Definition at line 116 of file BLI_memiter.cc.

References BLI_memiter::chunk_size_in_bytes_min, MEM_callocN(), MEM_SIZE_OVERHEAD, and memiter_init().

Referenced by DRW_text_cache_create(), memiter_empty_test(), memiter_string_test(), memiter_words10k_test(), and TEST().

◆ BLI_memiter_destroy()

void BLI_memiter_destroy ( BLI_memiter * mi)

◆ BLI_memiter_elem_first()

void * BLI_memiter_elem_first ( BLI_memiter * mi)

Support direct lookup for the first item.

Definition at line 243 of file BLI_memiter.cc.

References BLI_memiter_chunk::data, BLI_memiter_elem::data, and BLI_memiter::head.

◆ BLI_memiter_elem_first_size()

void * BLI_memiter_elem_first_size ( BLI_memiter * mi,
uint * r_size )

◆ BLI_memiter_iter_done()

bool BLI_memiter_iter_done ( const BLI_memiter_handle * iter)

Definition at line 283 of file BLI_memiter.cc.

References BLI_memiter_handle::elem_left.

◆ BLI_memiter_iter_init()

◆ BLI_memiter_iter_step()

◆ BLI_memiter_iter_step_size()

◆ data_offset_from_size()

BLI_INLINE uint data_offset_from_size ( uint size)

Definition at line 85 of file BLI_memiter.cc.

References BLI_INLINE, PADUP, and size().

Referenced by BLI_memiter_alloc(), BLI_memiter_iter_step(), and BLI_memiter_iter_step_size().

◆ memiter_chunk_step()

◆ memiter_free_data()

void memiter_free_data ( BLI_memiter * mi)
static

◆ memiter_init()

void memiter_init ( BLI_memiter * mi)
static

◆ memiter_set_rewind_offset()

void memiter_set_rewind_offset ( BLI_memiter * mi)
static