1#include "internal.h"
2#include <math/range.h>
3
4/* All the 'full' wrappers */
5
6#define desc_fn(op, y) a->desc->ops->op(a, PP_UNPAREN(y))
7#define check_ptr(fn_name) \
8 do { \
9 struct arena_desc *desc = a->desc; \
10 struct arena_fn_desc *found = NULL; \
11 for (int i = 0; i < ARENA_MAX_FN; i++) { \
12 if (any_fn_eq(any_fn_from(a->desc->ops->fn_name), \
13 desc->fn_descs[i].fn)) { \
14 enforce(!found); \
15 found = &desc->fn_descs[i]; \
16 } \
17 } \
18 enforce(found); \
19 if (found->type == \
20 ARENA_FN_PARAMS) { /* We notably allow NULL pointers to pass, since those are often used as sentinels */ \
21 if (ptr && !IN_RANGE((uintptr_t) ptr, THREAD_STACKS_HEAP_START, \
22 THREAD_STACKS_HEAP_END)) { \
23 arena_warn("arena_desc %p function " #fn_name \
24 " marked as taking PARAMS, but ptr does not seem " \
25 "like it is on stack", \
26 desc); \
27 } \
28 } \
29 } while (0)
30
31#ifdef DEBUG_ARENA
32static void cc_unused do_checks(struct arena *a) {
33 if (a->flags & ARENA_FLAG_LOCKED) {}
34}
35#else
36static cc_maybe_unused void do_checks(struct arena *a) {
37 cc_ignore(a);
38}
39#endif
40
41void *arena_alloc_full(struct arena *a, size_t size, struct alloc_params ap) {
42 desc_fn(alloc, (size, ap));
43 return NULL;
44}
45
46void *arena_realloc_full(struct arena *a, void *ptr, size_t size,
47 struct alloc_params ap) {
48 cc_ignore(size, ap);
49 check_ptr(realloc);
50 return NULL;
51}
52
53void *arena_alloc_special_full(struct arena *a, struct arena_params *p,
54 struct alloc_params ap) {
55 cc_ignore(a, p, ap);
56 return NULL;
57}
58
59void *arena_alloc_aligned_full(struct arena *a, size_t size, size_t align,
60 struct alloc_params ap) {
61 cc_ignore(a, size, align, ap);
62 return NULL;
63}
64
65err_checked arena_free_full(struct arena *a, void *ptr,
66 struct alloc_params ap) {
67 cc_ignore(a, ptr, ap);
68 check_ptr(free);
69 return ERR_OK;
70}
71
72err_checked arena_free_aligned_full(struct arena *a, void *ptr, size_t align,
73 struct alloc_params ap) {
74 cc_ignore(ptr, align, ap);
75 check_ptr(free_aligned);
76 return ERR_OK;
77}
78
79err_checked arena_clear_full(struct arena *a, struct arena_params *p) {
80 cc_ignore(a, p);
81 return ERR_OK;
82}
83
84void arena_destroy_full(struct arena *a, struct arena_params *p) {
85 cc_ignore(a, p);
86}
87
88void arena_reset_full(struct arena *a, struct arena_params *p) {
89 cc_ignore(a, p);
90}
91
92err_checked arena_set_tag_full(struct arena *a, void *ptr, arena_tag_t tag) {
93 cc_ignore(a, ptr, tag);
94 return ERR_OK;
95}
96
97err_checked arena_set_budget_full(struct arena *a, struct arena_budget b) {
98 cc_ignore(a, b);
99 return ERR_OK;
100}
101
102size_t arena_qry_size_full(struct arena *a, void *ptr) {
103 cc_ignore(a, ptr);
104 check_ptr(qry_size);
105 return ERR_OK;
106}
107
108arena_tag_t arena_qry_tag_full(struct arena *a, void *ptr) {
109 cc_ignore(a, ptr);
110 check_ptr(qry_tag);
111 return 0;
112}
113
114stack_handle_t arena_qry_trace_full(struct arena *a, void *ptr) {
115 cc_ignore(a, ptr);
116 check_ptr(qry_trace);
117 return (stack_handle_t) 0;
118}
119
120bool arena_qry_owns_full(struct arena *a, const void *ptr) {
121 check_ptr(qry_owns);
122 return false;
123}
124
125struct log_site *arena_get_log_site_full(struct arena *a,
126 struct arena_params *p) {
127 cc_ignore(a, p);
128 return NULL;
129}
130
131struct arena_budget arena_get_budget_full(struct arena *a,
132 struct arena_params *p) {
133 cc_ignore(a, p);
134 return (struct arena_budget){0};
135}
136
137struct arena_dumpster *arena_get_dumpster_full(struct arena *a,
138 struct arena_params *p) {
139 cc_ignore(a, p);
140 return NULL;
141}
142
143arena_identity_t arena_get_identity_full(struct arena *a,
144 struct arena_params *p) {
145 cc_ignore(a, p);
146 return 0;
147}
148
149bool arena_identity_eq_full(struct arena *a, struct arena *b) {
150 cc_ignore(a, b);
151 return false;
152}
153
154err_checked arena_on_hook_full(struct arena *a, enum arena_hook_type hook) {
155 cc_ignore(a, hook);
156 return ERR_OK;
157}
158
159bool arena_is_empty_full(struct arena *a) {
160 cc_ignore(a);
161 return false;
162}
163
164bool arena_getref_full(struct arena *a) {
165 cc_ignore(a);
166 return false;
167}
168
169void arena_putref_full(struct arena *a) {
170 cc_ignore(a);
171}
172