-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy patharena.h
More file actions
94 lines (77 loc) · 2.29 KB
/
Copy patharena.h
File metadata and controls
94 lines (77 loc) · 2.29 KB
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#ifndef ARENA_H
#define ARENA_H
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include "memkit_config.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef enum arena_status {
ARENA_OK = 0,
ARENA_ERR_NULL,
ARENA_ERR_INVALID,
ARENA_ERR_OOM,
ARENA_ERR_UNSUPPORTED,
} arena_status_t;
typedef enum arena_flag : unsigned {
ARENA_FLAG_NONE = 0u,
ARENA_FLAG_OWNS_BACKING = 1u << 0u, /* arena frees backing on deinit */
ARENA_FLAG_DYNAMIC_BACKING = 1u << 1u, /* backing came from heap (if enabled) */
ARENA_FLAG_MMAP_BACKING = 1u << 2u, /* backing came from mmap (MPU only) */
} arena_flag_t;
typedef enum arena_backing {
ARENA_BACKING_USER_BUFFER = MEMKIT_MEMORY_FIXED_BUFFER,
ARENA_BACKING_HEAP = MEMKIT_MEMORY_HEAP,
ARENA_BACKING_MMAP = MEMKIT_MEMORY_MMAP,
} arena_backing_t;
typedef struct arena {
uint8_t *base;
size_t capacity_bytes;
size_t offset_bytes;
size_t allocation_count;
unsigned flags;
} arena_t;
typedef struct arena_config {
void *backing; /* start of arena memory region */
size_t backing_bytes; /* total arena size in bytes */
unsigned flags; /* ARENA_FLAG_* backing ownership */
} arena_config_t;
typedef struct arena_stats {
size_t capacity_bytes;
size_t used_bytes;
size_t remaining_bytes;
size_t allocation_count;
} arena_stats_t;
[[nodiscard]] arena_status_t arena_init(arena_t *arena, const arena_config_t *config);
[[nodiscard]] arena_status_t arena_create(arena_t **arena, size_t backing_bytes);
[[nodiscard]] arena_status_t arena_create_with_backing(
arena_t **arena,
size_t backing_bytes,
arena_backing_t backing
);
void arena_deinit(arena_t *arena);
void arena_destroy(arena_t *arena);
void arena_reset(arena_t *arena);
[[nodiscard]] arena_status_t arena_alloc(
arena_t *arena,
size_t size,
size_t alignment,
void **out_ptr
);
[[nodiscard]] arena_status_t arena_calloc(
arena_t *arena,
size_t count,
size_t size,
size_t alignment,
void **out_ptr
);
[[nodiscard]] arena_status_t arena_stats(const arena_t *arena, arena_stats_t *out_stats);
[[nodiscard]] static inline bool arena_status_ok(arena_status_t status)
{
return status == ARENA_OK;
}
#ifdef __cplusplus
}
#endif
#endif /* ARENA_H */