blob: 61a59f928cbdeab7024679561414d0fa120be2e1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
# 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`
|