1#include <mem/arena.h>
2#include <mem/arena_provider.h>
3#include <sync/rcu.h>
4
5struct arena_layout_desc {
6 uint8_t total_header_size;
7 int8_t offset_tag;
8 int8_t offset_depot;
9 int8_t offset_canary;
10};
11
12struct arena_desc_table {
13 struct arena_desc **descs cc_counted_by(desc_count);
14 size_t desc_count;
15 struct rcu_cb rcu_cb;
16};
17
18struct arena_globals {
19 struct arena_desc_table cc_mem_rcu *desc_table;
20 struct spinlock tbl_lock;
21};
22
23extern struct arena_globals arena_global;
24
25bool arena_check(struct arena *a);
26#define arena_check_assert(a) enforce(arena_check(a))
27
28static inline struct arena_seg_inmem_desc *
29arena_get_inmem_descs(struct arena *a) {
30 return (struct arena_seg_inmem_desc *) &a->payload;
31}
32
33LOG_SITE_EXTERN(arena);
34LOG_HANDLE_EXTERN(arena);
35
36#define arena_log(lvl, fmt, ...) \
37 log(LOG_SITE(arena), LOG_HANDLE(arena), lvl, fmt, ##__VA_ARGS__)
38
39#define arena_err(fmt, ...) arena_log(LOG_ERROR, fmt, ##__VA_ARGS__)
40#define arena_warn(fmt, ...) arena_log(LOG_WARN, fmt, ##__VA_ARGS__)
41#define arena_info(fmt, ...) arena_log(LOG_INFO, fmt, ##__VA_ARGS__)
42#define arena_debug(fmt, ...) arena_log(LOG_DEBUG, fmt, ##__VA_ARGS__)
43#define arena_trace(fmt, ...) arena_log(LOG_TRACE, fmt, ##__VA_ARGS__)
44
45void arena_dumpster_delete_bin(struct arena_dumpster *ad, struct arena_bin *ab);
46
47#ifdef TEST_ARENA
48#include "tests/import.h"
49#endif
50