summaryrefslogtreecommitdiff
path: root/docs/application/memory.md
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`