4#if !defined(SKIP_INCLUDES)
11#if !defined BLOCK_SIZE
12 #if !defined DC_PLACEHOLDERS
19 #if !defined DC_PLACEHOLDERS
22 #define SLAB_SIZE 4096
28 "Block size must be at least pointer size for freelist");
30#define SLAB_VECTOR NS(NAME, slab_vector)
32#pragma push_macro("ALLOC")
45#define ITEM NS(NAME, slab_info)
46#define ITEM_CLONE NS(NAME, slab_info_clone)
47#define ITEM_DELETE NS(NAME, slab_info_delete)
48#define ITEM_DEBUG NS(NAME, slab_info_debug)
49#define INTERNAL_NAME SLAB_VECTOR
52#pragma pop_macro("ALLOC")
64 .free_list_head = NULL,
65 .alloc_ref = alloc_ref,
66 .derive_c_slaballoc = {},
79 for (
size_t i = 0; i < blocks_per_slab; i++) {
80 void* block_ptr = (
char*)slab_ptr + (i *
BLOCK_SIZE);
83 block_ptr,
sizeof(
void*));
84 *(
void**)block_ptr = self->free_list_head;
85 self->free_list_head = block_ptr;
100 if (self->free_list_head == NULL) {
104 void* block = self->free_list_head;
109 void*
next = *(
void**)block;
110 self->free_list_head =
next;
128 memset(ptr, 0,
size);
146 *(
void**)ptr = self->free_list_head;
147 self->free_list_head = ptr;
157 DC_ASSERT(old_size > 0,
"Cannot reallocate zero sized");
158 DC_ASSERT(new_size > 0,
"Cannot allocate zero sized");
166 size_t copy_size = (old_size < new_size) ? old_size : new_size;
167 memcpy(new_ptr, ptr, copy_size);
169 if (new_size <= old_size) {
186 for (
size_t i = 0; i < num_slabs; i++) {
194 self->free_list_head = NULL;
static DC_PUBLIC void deallocate(SELF *self, void *ptr, size_t size)
static DC_PUBLIC void debug(SELF const *self, dc_debug_fmt fmt, FILE *stream)
static DC_PUBLIC void * allocate_zeroed(SELF *self, size_t size)
static DC_PUBLIC void reset(SELF *self)
#define BLOCK_SIZE
A chunked bump allocator that allocates memory in fixed-size blocks.
static DC_PUBLIC void * allocate_uninit(SELF *self, size_t size)
static DC_PUBLIC void * reallocate(SELF *self, void *ptr, size_t old_size, size_t new_size)
static void slab_info_debug(slab_info const *, dc_debug_fmt, FILE *)
static void slab_info_delete(slab_info *)
static slab_info slab_info_clone(slab_info const *self)
static DC_INTERNAL void PRIV allocate_new_slab(SELF *self)
#define DC_TRAIT_ALLOC(SELF)
static DC_PUBLIC IV_PAIR next(ITER *iter)
static DC_PUBLIC VALUE const * read(SELF const *self, INDEX index)
static DC_PUBLIC size_t size(SELF const *self)
static DC_PUBLIC void remove_at(SELF *self, size_t at, size_t count)
static DC_PUBLIC ITEM * push(SELF *self, ITEM item)
#define TEMPLATE_ERROR(...)
With the user provided name, even in nested templates.
#define NAME
Supporting templates that internally invoke new templates.
static DC_PUBLIC void dc_debug_fmt_print(dc_debug_fmt fmt, FILE *stream, const char *format,...)
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_scope_end(dc_debug_fmt fmt)
static DC_PUBLIC dc_debug_fmt dc_debug_fmt_scope_begin(dc_debug_fmt fmt)
static DC_PUBLIC void dc_memory_tracker_set(dc_memory_tracker_level level, dc_memory_tracker_capability cap, const volatile void *addr, size_t size)
@ DC_MEMORY_TRACKER_LVL_ALLOC
@ DC_MEMORY_TRACKER_CAP_WRITE
@ DC_MEMORY_TRACKER_CAP_NONE
@ DC_MEMORY_TRACKER_CAP_READ_WRITE
#define DC_EXPAND_STRING(NAME)
#define DC_ASSERT(expr,...)
#define DC_ASSUME(expr,...)
#define DC_TRAIT_REFERENCABLE_BY_PTR(SELF)
dc_gdb_marker derive_c_slaballoc
Debug format helpers for debug printin data structures.
static DC_PUBLIC FILE * stream(SELF *self)