koliseo 0.4.9
Loading...
Searching...
No Matches
kls_region.h
Go to the documentation of this file.
1// jgabaut @ github.com/jgabaut
2// SPDX-License-Identifier: GPL-3.0-only
3/*
4 Copyright (C) 2023-2025 jgabaut
5
6 This program is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, version 3 of the License.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <https://www.gnu.org/licenses/>.
17*/
18#ifndef _WIN32
19#define _POSIX_C_SOURCE 200809L
20#endif
21#include <time.h>
22#include <stddef.h>
23#include <assert.h>
24
25#ifndef KLS_AUTOREGION_AUTOSET_DEFAULT
26#define KLS_AUTOREGION_AUTOSET_DEFAULT 1
27#endif // KLS_AUTOREGION_AUTOSET_DEFAULT
28
29#ifndef KLS_AUTOREGION_ALLOC_DEFAULT
30#define KLS_AUTOREGION_ALLOC_DEFAULT KLS_REGLIST_ALLOC_KLS_BASIC
31#endif // KLS_AUTOREGION_ALLOC_DEFAULT
32
33#ifndef KLS_AUTOREGION_REGLIST_SIZE_DEFAULT
34#define KLS_AUTOREGION_REGLIST_SIZE_DEFAULT KLS_DEFAULT_SIZE
35#endif // KLS_AUTOREGION_REGLIST_SIZE_DEFAULT
36
37#ifndef KLS_AUTOREGION_AUTOSET_TEMP_DEFAULT
38#define KLS_AUTOREGION_AUTOSET_TEMP_DEFAULT 1
39#endif // KLS_AUTOREGION_AUTOSET_TEMP_DEFAULT
40
41#ifndef KLS_AUTOREGION_ALLOC_TEMP_DEFAULT
42#define KLS_AUTOREGION_ALLOC_TEMP_DEFAULT KLS_REGLIST_ALLOC_KLS_BASIC
43#endif // KLS_AUTOREGION_ALLOC_TEMP_DEFAULT
44
45#ifndef KLS_AUTOREGION_REGLIST_TEMP_SIZE_DEFAULT
46#define KLS_AUTOREGION_REGLIST_TEMP_SIZE_DEFAULT KLS_DEFAULT_SIZE
47#endif // KLS_AUTOREGION_REGLIST_TEMP_SIZE_DEFAULT
48
59
66
73
83
88#define KLS_REGIONTYPE_MAX KLS_Header
89
94#define KLS_REGION_MAX_NAME_SIZE 15
99#define KLS_REGION_MAX_DESC_SIZE 20
100
106typedef struct KLS_Region {
107 ptrdiff_t begin_offset;
108 ptrdiff_t end_offset;
109 ptrdiff_t size;
110 ptrdiff_t padding;
113 int type;
115
116static const char KOLISEO_DEFAULT_REGION_NAME[] = "No Name";
117static const char KOLISEO_DEFAULT_REGION_DESC[] = "No Desc";
118
120
129
131
132struct Koliseo; // Forward declaration
133struct Koliseo_Temp; // Forward declaration
134
143
152
153void KLS_autoregion_on_new(struct Koliseo* kls);
154void KLS_autoregion_on_free(struct Koliseo* kls);
155void KLS_autoregion_on_push(struct Koliseo* kls, ptrdiff_t padding, const char* caller, void* user);
156void KLS_autoregion_on_temp_start(struct Koliseo_Temp* t_kls);
157void KLS_autoregion_on_temp_free(struct Koliseo_Temp* t_kls);
158void KLS_autoregion_on_temp_push(struct Koliseo_Temp* t_kls, ptrdiff_t padding, const char* caller, void* user);
159
160#undef KLS_DEFAULT_HOOKS
161#define KLS_DEFAULT_HOOKS (KLS_Hooks) { \
162 .on_new_handler = &KLS_autoregion_on_new, \
163 .on_free_handler = &KLS_autoregion_on_free, \
164 .on_push_handler = &KLS_autoregion_on_push, \
165 .on_temp_start_handler = &KLS_autoregion_on_temp_start, \
166 .on_temp_free_handler = &KLS_autoregion_on_temp_free, \
167 .on_temp_push_handler = &KLS_autoregion_on_temp_push, \
168 }
169
170#include "koliseo.h"
171
172#ifndef KOLISEO_HAS_LOCATE
173void *kls_push_zero_named(Koliseo * kls, ptrdiff_t size, ptrdiff_t align,
174 ptrdiff_t count, char *name, char *desc);
175#else
176void *kls_push_zero_named_dbg(Koliseo * kls, ptrdiff_t size, ptrdiff_t align,
177 ptrdiff_t count, char *name, char *desc, Koliseo_Loc loc);
178#define kls_push_zero_named(kls, size, align, count, name, desc) kls_push_zero_named_dbg((kls), (size), (align), (count), (name), (desc), KLS_HERE)
179#endif // KOLISEO_HAS_LOCATE
180
181#ifndef KOLISEO_HAS_LOCATE
182void *kls_push_zero_typed(Koliseo * kls, ptrdiff_t size, ptrdiff_t align,
183 ptrdiff_t count, int type, char *name, char *desc);
184#else
185void *kls_push_zero_typed_dbg(Koliseo * kls, ptrdiff_t size, ptrdiff_t align,
186 ptrdiff_t count, int type, char *name, char *desc, Koliseo_Loc loc);
187#define kls_push_zero_typed(kls, size, align, count, type, name, desc) kls_push_zero_typed_dbg((kls), (size), (align), (count), (type), (name), (desc), KLS_HERE)
188#endif // KOLISEO_HAS_LOCATE
189
190#ifndef KOLISEO_HAS_LOCATE
191void *kls_temp_push_zero_named(Koliseo_Temp * t_kls, ptrdiff_t size,
192 ptrdiff_t align, ptrdiff_t count, char *name,
193 char *desc);
194#else
195void *kls_temp_push_zero_named_dbg(Koliseo_Temp * t_kls, ptrdiff_t size,
196 ptrdiff_t align, ptrdiff_t count, char *name,
197 char *desc, Koliseo_Loc loc);
198#define kls_temp_push_zero_named(t_kls, size, align, count, name, desc) kls_temp_push_zero_named_dbg((t_kls), (size), (align), (count), (name), (desc), KLS_HERE)
199#endif // KOLISEO_HAS_LOCATE
200
201#ifndef KOLISEO_HAS_LOCATE
202void *kls_temp_push_zero_typed(Koliseo_Temp * t_kls, ptrdiff_t size,
203 ptrdiff_t align, ptrdiff_t count, int type,
204 char *name, char *desc);
205#else
206void *kls_temp_push_zero_typed_dbg(Koliseo_Temp * t_kls, ptrdiff_t size,
207 ptrdiff_t align, ptrdiff_t count, int type,
208 char *name, char *desc, Koliseo_Loc loc);
209#define kls_temp_push_zero_typed(t_kls, size, align, count, type, name, desc) kls_temp_push_zero_typed_dbg((t_kls), (size), (align), (count), (type), (name), (desc), KLS_HERE)
210#endif // KOLISEO_HAS_LOCATE
211
212#undef KLS_PUSH_ARR_NAMED
213#define KLS_PUSH_ARR_NAMED(kls, type, count, name, desc) (type*)kls_push_zero_named((kls), sizeof(type), _Alignof(type), (count), (name), (desc))
214
215#undef KLS_PUSH_ARR_TYPED
216#define KLS_PUSH_ARR_TYPED(kls, type, count, region_type, name, desc) (type*)kls_push_zero_typed((kls), sizeof(type), _Alignof(type), (count), (region_type), (name), (desc))
217
218#undef KLS_PUSH_ARR_T_NAMED
219#define KLS_PUSH_ARR_T_NAMED(kls_temp, type, count, name, desc) (type*)kls_temp_push_zero_named((kls_temp), sizeof(type), _Alignof(type), (count), (name), (desc))
220
221#undef KLS_PUSH_ARR_T_TYPED
222#define KLS_PUSH_ARR_T_TYPED(kls_temp, type, count, region_type, name, desc) (type*)kls_temp_push_zero_typed((kls_temp), sizeof(type), _Alignof(type), (count), (region_type), (name), (desc))
223
225#define KLS_RL_GETLIST() kls_rl_emptyList()
231
233#define KLS_RL_FREELIST(kls_list) kls_rl_freeList(kls_list)
235#define kls_showList(list) kls_rl_showList((list))
237#define kls_showList_toFile(list, fp) kls_rl_showList_toFile((list), (fp))
238#define KLS_RL_ECHOLIST(kls_list) kls_rl_showList(kls_list)
239#define KLS_RL_PRINTLIST(kls_list,file) kls_rl_showList_toFile(kls_list,file)
246
248#define KLS_RL_PUSHLIST(kls,reg,kls_list) kls_rl_insord(kls,reg,kls_list)
252#define KLS_RL_PUSHLIST_P(kls,reg,kls_list) kls_rl_insord_p(kls,reg,kls_list)
256
257#define KLS_RL_DIFF(kls,kls_list1,kls_list2) kls_rl_diff(kls,kls_list1,kls_list2)
260ptrdiff_t kls_avg_regionSize(Koliseo *);
261void kls_usageReport_toFile(Koliseo *, FILE *);
262void kls_usageReport(Koliseo *);
263ptrdiff_t kls_type_usage(int, Koliseo *);
264ptrdiff_t kls_total_padding(Koliseo *);
const char * kls_reglist_backend_strings[KLS_REGLIST_TOTAL_BACKENDS]
Defines strings for KLS_RegList_Alloc_Backend values.
Definition kls_region.c:21
KLS_Region_List kls_rl_intersect(Koliseo *, KLS_Region_List, KLS_Region_List)
Definition kls_region.c:526
KLS_Region_List kls_rl_insord_p(Koliseo *, KLS_list_element, KLS_Region_List)
Definition kls_region.c:404
KLS_Region_List kls_rl_cons(Koliseo *, KLS_list_element, KLS_Region_List)
Definition kls_region.c:94
bool kls_rl_isLess(KLS_list_element, KLS_list_element)
KLS_Region_List kls_rl_reverse(Koliseo *, KLS_Region_List)
Definition kls_region.c:342
KLS_Region_List kls_rl_append(Koliseo *, KLS_Region_List, KLS_Region_List)
Definition kls_region.c:329
KLS_Region_List kls_rl_delete(Koliseo *, KLS_list_element, KLS_Region_List)
Definition kls_region.c:369
void kls_usageReport(Koliseo *)
Print usage report for passed Koliseo to stdout.
Definition kls_region.c:668
KLS_Region_List kls_rl_diff(Koliseo *, KLS_Region_List, KLS_Region_List)
Definition kls_region.c:547
#define KLS_REGION_MAX_NAME_SIZE
Defines max size for KLS_Region's name field.
Definition kls_region.h:94
KLS_Region_List kls_rl_insord(Koliseo *, KLS_list_element, KLS_Region_List)
Definition kls_region.c:386
KLS_Region * KLS_list_element
Redundant typedef to better denote the actual value field of a KLS_region_list_item.
Definition kls_region.h:119
void kls_rl_showList(KLS_Region_List)
Definition kls_region.c:302
ptrdiff_t kls_type_usage(int, Koliseo *)
Calc memory used by the specific type of KLS_list_element.
Definition kls_region.c:680
KLS_region_list_item * KLS_Region_List
Definition kls_region.h:130
void KLS_autoregion_on_free(struct Koliseo *kls)
Definition kls_region.c:1416
ptrdiff_t kls_regionSize(KLS_list_element)
KLS_Region_List kls_rl_emptyList(void)
Definition kls_region.c:62
void kls_usageReport_toFile(Koliseo *, FILE *)
Prints an usage report for the passed Koliseo to the passed file.
Definition kls_region.c:637
KLS_RegList_Alloc_Backend
Defines allocation backend for KLS_Region_List items.
Definition kls_region.h:54
@ KLS_REGLIST_ALLOC_KLS_BASIC
Definition kls_region.h:56
@ KLS_REGLIST_TOTAL_BACKENDS
Definition kls_region.h:57
@ KLS_REGLIST_ALLOC_LIBC
Definition kls_region.h:55
KLS_Region_List kls_rl_t_cons(Koliseo_Temp *, KLS_list_element, KLS_Region_List)
Definition kls_region.c:196
bool kls_rl_empty(KLS_Region_List)
Definition kls_region.c:67
void KLS_autoregion_on_new(struct Koliseo *kls)
Definition kls_region.c:1337
KLS_Region_List kls_rl_mergeList(Koliseo *, KLS_Region_List, KLS_Region_List)
Definition kls_region.c:496
int kls_rl_length(KLS_Region_List)
Definition kls_region.c:320
void KLS_autoregion_on_temp_push(struct Koliseo_Temp *t_kls, ptrdiff_t padding, const char *caller, void *user)
Definition kls_region.c:1553
void * kls_push_zero_named(Koliseo *kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count, char *name, char *desc)
Takes a Koliseo pointer, and ptrdiff_t values for size, align and count.
Definition kls_region.c:960
KLS_list_element kls_rl_head(KLS_Region_List)
Definition kls_region.c:76
void * kls_temp_push_zero_named(Koliseo_Temp *t_kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count, char *name, char *desc)
Takes a Koliseo_Temp, and ptrdiff_t values for size, align and count.
Definition kls_region.c:1058
void kls_rl_freeList(KLS_Region_List)
Frees all values and nodes for passed Region list.
Definition kls_region.c:244
KLS_Region_Type
Represents a type index for Regions.
Definition kls_region.h:78
@ KLS_Header
Definition kls_region.h:81
@ KLS_None
Definition kls_region.h:79
@ Temp_KLS_Header
Definition kls_region.h:80
void kls_rl_showList_toFile(KLS_Region_List, FILE *fp)
Definition kls_region.c:263
KLS_Region_List kls_rl_copy(Koliseo *, KLS_Region_List)
Definition kls_region.c:356
void * kls_temp_push_zero_typed(Koliseo_Temp *t_kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count, int type, char *name, char *desc)
Takes a Koliseo_Temp, a KLS_Region_Type index, and ptrdiff_t values for size, align and count.
Definition kls_region.c:1254
KLS_Region_List kls_rl_tail(KLS_Region_List)
Definition kls_region.c:85
bool kls_rl_isEqual(KLS_list_element, KLS_list_element)
void KLS_autoregion_on_temp_free(struct Koliseo_Temp *t_kls)
Definition kls_region.c:1520
struct KLS_list_region KLS_region_list_item
Defines the node for a KLS_Region_List.
double kls_usageShare(KLS_list_element, Koliseo *)
void KLS_autoregion_on_push(struct Koliseo *kls, ptrdiff_t padding, const char *caller, void *user)
Definition kls_region.c:1434
void KLS_autoregion_on_temp_start(struct Koliseo_Temp *t_kls)
Definition kls_region.c:1455
ptrdiff_t kls_avg_regionSize(Koliseo *)
Return average region size in usage for the passed Koliseo.
Definition kls_region.c:603
bool kls_rl_member(KLS_list_element, KLS_Region_List)
Definition kls_region.c:307
const char * kls_reglist_backend_string(KLS_RegList_Alloc_Backend kls_be)
Returns the string corresponding to passed kls_be.
Definition kls_region.c:46
#define KLS_REGION_MAX_DESC_SIZE
Defines max size for KLS_Region's desc field.
Definition kls_region.h:99
void * kls_push_zero_typed(Koliseo *kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count, int type, char *name, char *desc)
Takes a Koliseo pointer, a KLS_Region_Type index, and ptrdiff_t values for size, align and count.
Definition kls_region.c:1157
ptrdiff_t kls_total_padding(Koliseo *)
Calc memory used as padding for the passed Koliseo.
Definition kls_region.c:708
Definition kls_region.h:135
int kls_autoset_temp_regions
If set to 1, make the Koliseo handle the KLS_Regions for its usage when operating on a Koliseo_Temp i...
Definition kls_region.h:139
ptrdiff_t tkls_reglist_kls_size
Sets the size for reglist_kls when on KLS_REGLIST_ALLOC_KLS_BASIC.
Definition kls_region.h:141
KLS_RegList_Alloc_Backend kls_reglist_alloc_backend
Sets the backend for the KLS_Regions allocation.
Definition kls_region.h:137
KLS_RegList_Alloc_Backend tkls_reglist_alloc_backend
Sets the backend for the KLS_Regions allocation.
Definition kls_region.h:140
ptrdiff_t kls_reglist_kls_size
Sets the size for reglist_kls when on KLS_REGLIST_ALLOC_KLS_BASIC.
Definition kls_region.h:138
int kls_autoset_regions
If set to 1, make the Koliseo handle the KLS_Regions for its usage.
Definition kls_region.h:136
Definition kls_region.h:144
struct Koliseo * reglist_kls
When conf.kls_reglist_alloc_backend is KLS_REGLIST_ALLOC_KLS_BASIC, points to the backing kls for reg...
Definition kls_region.h:146
int max_regions_kls_alloc_basic
Contains maximum number of allocatable KLS_Region when using KLS_REGLIST_ALLOC_KLS_BASIC.
Definition kls_region.h:147
struct Koliseo * t_reglist_kls
When conf.kls_reglist_alloc_backend is KLS_REGLIST_ALLOC_KLS_BASIC, points to the backing kls for t_r...
Definition kls_region.h:149
KLS_Region_List regs
List of allocated Regions.
Definition kls_region.h:145
KLS_Region_List t_regs
List of allocated Regions for a Koliseo_Temp instance.
Definition kls_region.h:148
KLS_Autoregion_Extension_Conf conf
Contains config for autoregion extension.
Definition kls_region.h:150
Represents an allocated memory region in a Koliseo.
Definition kls_region.h:106
int type
Used to identify which type the KLS_Region holds.
Definition kls_region.h:113
char desc[KLS_REGION_MAX_DESC_SIZE+1]
Description field for the KLS_Region.
Definition kls_region.h:112
ptrdiff_t end_offset
Ending offset of memory region.
Definition kls_region.h:108
ptrdiff_t begin_offset
Starting offset of memory region.
Definition kls_region.h:107
char name[KLS_REGION_MAX_NAME_SIZE+1]
Name field for the KLS_Region.
Definition kls_region.h:111
ptrdiff_t padding
Size of padding for the KLS_Region.
Definition kls_region.h:110
ptrdiff_t size
Size of memory for the KLS_Region.
Definition kls_region.h:109
Defines the node for a KLS_Region_List.
Definition kls_region.h:125
struct KLS_list_region * next
Pointer to the next node int the list.
Definition kls_region.h:127
KLS_list_element value
The KLS_Region value.
Definition kls_region.h:126