# Memory Pool --- ## Object Definitions ```c #define KPL_ALLOC_HEADER(STRCUT) size_t obj_size : 56; int8_t tree_weight; STRCUT *prev typedef struct _kpl_alloc_obj { KPL_ALLOC_HEADER(_kpl_alloc_obj); } kpl_alloc_obj; #define KPL_ALLOC_TREE_HEADER(STRCUT) KPL_ALLOC_TREE_HEADER(STRUCT); STRUCT *next, *parent typdef struct _kpl_alloc_tree_obj { KPL_ALLOC_TREE_HEADER(struct _kpl_alloc_tree_obj); } kpl_alloc_tree_obj; #define KPL_ALLOC_POOL_SIZE 56 typedef struct kpl_alloc { _Atomic size_t bytes_allocated; kpl_mutex mutex; kpl_alloc_obj *pool[KPL_ALLOC_POOL_SIZE] } kpl_alloc; #define KPL_SLAB_HEADER(STRUCT) STRCUT *prev typdef strcut _kpl_slab_obj { KPL_SLAB_HEADER(strcut _kpl_slab_obj); } kpl_slab_obj; #define KPL_SLAB_LIST_HEADER(STRCUT) STRCUT *prev, *next typdef strcut _kpl_slab_list_obj { KPL_SLAB_LIST_HEADER(strcut _kpl_slab_list_obj); } kpl_slab_list_obj; #define KPL_SLAB_TREE_HEADER(STRUCT) STRUCT *prev, *next, *parent; int8_t tree_weight typdef strcut _kpl_slab_tree_obj { KPL_SLAB_TREE_HEADER(struct _kpl_slab_tree_obj); } kpl_slab_tree_obj; typedef struct _kpl_slab { KPL_ALLOC_HEADER(struct _kpl_slab); uint32_t obj_size, byte_index; kpl_slab_obj *pool; kpl_mutex mutex; uint8_t byte_array[MAX_SIZE]; } kpl_slab; ``` # Alloc All allocated objects size must be aligned to the power of two ## Pooling Each bucket in the `kpl_alloc.pool` represents two to the power of the bucket index # AVL Tree For Slab And Alloc # Slab Allocated by `kpl_alloc` ## Pooling Objects for reuse are stored as a list by the `kpl_slab_obj.prev` on `kpl_slab.pool`