Kestrel Interface
Loading...
Searching...
No Matches
kest_alloc.c
Go to the documentation of this file.
1#include "kest_int.h"
2
3#ifndef PRINTLINES_ALLOWED
4#define PRINTLINES_ALLOWED 0
5#endif
6
7static const char *FNAME = "kest_alloc.c";
8
9static size_t total_current, total_peak;
10
11void *kest_alloc(size_t size)
12{
13 if (size == 0)
14 return NULL;
15
16 uint8_t *ptr = malloc(size + sizeof(size_t));
17
18 if (!ptr)
19 return NULL;
20
21 *(size_t*)ptr = size;
22
23 total_current += size;
24
25 if (total_current > total_peak)
26 total_peak = total_current;
27
28
29 return ptr + sizeof(size_t);
30}
31
32void kest_free(void *ptr)
33{
34 if (!ptr) return;
35
36 uint8_t *base_ptr = (uint8_t*)ptr - sizeof(size_t);
37
38 size_t size = *(size_t*)base_ptr;
39
40 total_current -= size;
41
42 free(base_ptr);
43}
44
45void *kest_realloc(void *ptr, size_t size)
46{
47 if (!ptr)
48 return kest_alloc(size);
49
50 if (size == 0)
51 kest_free(ptr);
52
53 uint8_t *base_ptr = (uint8_t*)ptr - sizeof(size_t);
54 size_t base_size = *(size_t*)base_ptr;
55
56 uint8_t *new_ptr = realloc(base_ptr, size + sizeof(size_t));
57
58 if (!new_ptr)
59 return NULL;
60
61 *(size_t*)new_ptr = size;
62
63 total_current += (size - base_size);
64
65 if (total_current > total_peak)
66 total_peak = total_current;
67
68
69 return new_ptr + sizeof(size_t);
70
71}
72
73char *kest_strndup(const char *str, size_t n)
74{
75 #ifdef KEST_LOG_ALLOCS
76 #endif
77
78 if (!str)
79 {
80
81 return NULL;
82
83 }
84
85 size_t len = strnlen(str, n);
86
87 char *new_str = kest_alloc(len + 1);
88
89 if (!new_str)
90 {
91
92 return NULL;
93
94 }
95
96 memcpy(new_str, str, len);
97 new_str[len] = '\0';
98
99
100 return new_str;
101
102}
103
104void kest_mem_monitor_task(void *param)
105{
106 #ifdef KEST_USE_FREERTOS
107 while (1)
108 {
110 vTaskDelay(pdMS_TO_TICKS(2000));
111 }
112 #endif
113}
114
115
117{
118 KEST_PRINTF("kest_mem_init()");
119 #ifdef PRINT_MEMORY_USAGE
120 #ifdef KEST_USE_FREERTOS
121 KEST_PRINTF("Spinning off memory printer task...\n");
122 xTaskCreate(
124 "memory_log",
125 2048,
126 NULL,
127 5,
128 NULL
129 );
130 #endif
131 #endif
132}
133
134#ifndef KEST_DESKTOP
135#ifndef KEST_LIBRARY
136void lv_mem_init(void)
137{
138 return;
139}
140
142{
143 return;
144}
145
146void * lv_malloc_core(size_t size)
147{
148 return kest_alloc(size);
149}
150void * lv_realloc_core(void * p, size_t new_size)
151{
152 return kest_realloc(p, new_size);
153}
154
155void lv_free_core(void * p)
156{
157 return kest_free(p);
158}
159
160void *kest_lv_malloc(size_t size)
161{
162 return heap_caps_malloc(size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
163}
164
165void kest_lv_free(void *ptr)
166{
167 heap_caps_free(ptr);
168}
169#endif
170#endif
171
173{
174 KEST_PRINTF("Memory usage: %d alloc'd, %d at peak\n", total_current, total_peak);
175}
176
178{
179 if (!a || !a->alloc)
180 return kest_alloc(n);
181
182 return a->alloc(a->data, n);
183}
184
185void *kest_allocator_realloc(kest_allocator *a, void *p, size_t n)
186{
187 if (!a || !a->realloc)
188 return kest_realloc(p, n);
189
190 return a->realloc(a->data, p, n);
191}
192
193void *kest_allocator_strndup(kest_allocator *a, const char *str, int n)
194{
195 if (!str) return NULL;
196
197 size_t len = strnlen(str, n);
198 char *new_str = kest_allocator_alloc(a, len + 1);
199
200 if (!new_str) return NULL;
201
202 memcpy(new_str, str, len);
203 new_str[len] = '\0';
204
205 return new_str;
206}
207
209{
210 if (!p)
211 return;
212
213 if (!a || !a->free)
214 {
215 kest_free(p);
216 return;
217 }
218
219 a->free(a->data, p);
220}
void lv_free_core(void *p)
Definition kest_alloc.c:155
void kest_free(void *ptr)
Definition kest_alloc.c:32
void * kest_lv_malloc(size_t size)
Definition kest_alloc.c:160
void * kest_allocator_alloc(kest_allocator *a, size_t n)
Definition kest_alloc.c:177
void * lv_realloc_core(void *p, size_t new_size)
Definition kest_alloc.c:150
void * kest_allocator_strndup(kest_allocator *a, const char *str, int n)
Definition kest_alloc.c:193
void print_memory_report()
Definition kest_alloc.c:172
void * kest_alloc(size_t size)
Definition kest_alloc.c:11
void kest_mem_init()
Definition kest_alloc.c:116
void lv_mem_init(void)
Definition kest_alloc.c:136
void * lv_malloc_core(size_t size)
Definition kest_alloc.c:146
void * kest_realloc(void *ptr, size_t size)
Definition kest_alloc.c:45
void kest_allocator_free(kest_allocator *a, void *p)
Definition kest_alloc.c:208
void lv_mem_deinit(void)
Definition kest_alloc.c:141
void * kest_allocator_realloc(kest_allocator *a, void *p, size_t n)
Definition kest_alloc.c:185
char * kest_strndup(const char *str, size_t n)
Definition kest_alloc.c:73
void kest_mem_monitor_task(void *param)
Definition kest_alloc.c:104
void kest_lv_free(void *ptr)
Definition kest_alloc.c:165
#define KEST_PRINTF(...)
Definition kest_printf.h:10
void *(* alloc)(void *data, size_t)
Definition kest_alloc.h:7
void *(* realloc)(void *data, void *, size_t)
Definition kest_alloc.h:8
void(* free)(void *data, void *)
Definition kest_alloc.h:9