koliseo 0.5.2
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
60
67
74
84
89#define KLS_REGIONTYPE_MAX KLS_Header
90
95#define KLS_REGION_MAX_NAME_SIZE 15
100#define KLS_REGION_MAX_DESC_SIZE 20
101
107typedef struct KLS_Region {
108 ptrdiff_t begin_offset;
109 ptrdiff_t end_offset;
110 ptrdiff_t size;
111 ptrdiff_t padding;
114 int type;
116
117static const char KOLISEO_DEFAULT_REGION_NAME[] = "No Name";
118static const char KOLISEO_DEFAULT_REGION_DESC[] = "No Desc";
119
121
130
132
133struct Koliseo; // Forward declaration
134struct Koliseo_Temp; // Forward declaration
135
144
153
154void KLS_autoregion_on_new(struct Koliseo* kls);
155void KLS_autoregion_on_free(struct Koliseo* kls);
156void KLS_autoregion_on_push(struct Koliseo* kls, ptrdiff_t padding, const char* caller, void* user);
157void KLS_autoregion_on_temp_start(struct Koliseo_Temp* t_kls);
158void KLS_autoregion_on_temp_free(struct Koliseo_Temp* t_kls);
159void KLS_autoregion_on_temp_push(struct Koliseo_Temp* t_kls, ptrdiff_t padding, const char* caller, void* user);
160
161#undef KLS_DEFAULT_HOOKS
162#define KLS_DEFAULT_HOOKS (KLS_Hooks) { \
163 .on_new_handler = &KLS_autoregion_on_new, \
164 .on_free_handler = &KLS_autoregion_on_free, \
165 .on_push_handler = &KLS_autoregion_on_push, \
166 .on_temp_start_handler = &KLS_autoregion_on_temp_start, \
167 .on_temp_free_handler = &KLS_autoregion_on_temp_free, \
168 .on_temp_push_handler = &KLS_autoregion_on_temp_push, \
169 }
170
171#include "koliseo.h"
172
173#ifndef KOLISEO_HAS_LOCATE
174void *kls_push_zero_named(Koliseo * kls, ptrdiff_t size, ptrdiff_t align,
175 ptrdiff_t count, char *name, char *desc);
176#else
177void *kls_push_zero_named_dbg(Koliseo * kls, ptrdiff_t size, ptrdiff_t align,
178 ptrdiff_t count, char *name, char *desc, Koliseo_Loc loc);
179#define kls_push_zero_named(kls, size, align, count, name, desc) kls_push_zero_named_dbg((kls), (size), (align), (count), (name), (desc), KLS_HERE)
180#endif // KOLISEO_HAS_LOCATE
181
182#ifndef KOLISEO_HAS_LOCATE
183void *kls_push_zero_typed(Koliseo * kls, ptrdiff_t size, ptrdiff_t align,
184 ptrdiff_t count, int type, char *name, char *desc);
185#else
186void *kls_push_zero_typed_dbg(Koliseo * kls, ptrdiff_t size, ptrdiff_t align,
187 ptrdiff_t count, int type, char *name, char *desc, Koliseo_Loc loc);
188#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)
189#endif // KOLISEO_HAS_LOCATE
190
191#ifndef KOLISEO_HAS_LOCATE
192void *kls_temp_push_zero_named(Koliseo_Temp * t_kls, ptrdiff_t size,
193 ptrdiff_t align, ptrdiff_t count, char *name,
194 char *desc);
195#else
196void *kls_temp_push_zero_named_dbg(Koliseo_Temp * t_kls, ptrdiff_t size,
197 ptrdiff_t align, ptrdiff_t count, char *name,
198 char *desc, Koliseo_Loc loc);
199#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)
200#endif // KOLISEO_HAS_LOCATE
201
202#ifndef KOLISEO_HAS_LOCATE
203void *kls_temp_push_zero_typed(Koliseo_Temp * t_kls, ptrdiff_t size,
204 ptrdiff_t align, ptrdiff_t count, int type,
205 char *name, char *desc);
206#else
207void *kls_temp_push_zero_typed_dbg(Koliseo_Temp * t_kls, ptrdiff_t size,
208 ptrdiff_t align, ptrdiff_t count, int type,
209 char *name, char *desc, Koliseo_Loc loc);
210#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)
211#endif // KOLISEO_HAS_LOCATE
212
213#undef KLS_PUSH_ARR_NAMED
214#define KLS_PUSH_ARR_NAMED(kls, type, count, name, desc) (type*)kls_push_zero_named((kls), sizeof(type), _Alignof(type), (count), (name), (desc))
215
216#undef KLS_PUSH_ARR_TYPED
217#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))
218
219#undef KLS_PUSH_ARR_T_NAMED
220#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))
221
222#undef KLS_PUSH_ARR_T_TYPED
223#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))
224
226#define KLS_RL_GETLIST() kls_rl_emptyList()
232
234#define KLS_RL_FREELIST(kls_list) kls_rl_freeList(kls_list)
236#define kls_showList(list) kls_rl_showList((list))
238#define kls_showList_toFile(list, fp) kls_rl_showList_toFile((list), (fp))
239#define KLS_RL_ECHOLIST(kls_list) kls_rl_showList(kls_list)
240#define KLS_RL_PRINTLIST(kls_list,file) kls_rl_showList_toFile(kls_list,file)
247
249#define KLS_RL_PUSHLIST(kls,reg,kls_list) kls_rl_insord(kls,reg,kls_list)
253#define KLS_RL_PUSHLIST_P(kls,reg,kls_list) kls_rl_insord_p(kls,reg,kls_list)
257
258#define KLS_RL_DIFF(kls,kls_list1,kls_list2) kls_rl_diff(kls,kls_list1,kls_list2)
261ptrdiff_t kls_avg_regionSize(Koliseo *);
262void kls_usageReport_toFile(Koliseo *, FILE *);
263void kls_usageReport(Koliseo *);
264ptrdiff_t kls_type_usage(int, Koliseo *);
265ptrdiff_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:533
KLS_Region_List kls_rl_insord_p(Koliseo *, KLS_list_element, KLS_Region_List)
Definition kls_region.c:410
KLS_Region_List kls_rl_cons(Koliseo *, KLS_list_element, KLS_Region_List)
Definition kls_region.c:97
bool kls_rl_isLess(KLS_list_element, KLS_list_element)
KLS_Region_List kls_rl_reverse(Koliseo *, KLS_Region_List)
Definition kls_region.c:348
KLS_Region_List kls_rl_append(Koliseo *, KLS_Region_List, KLS_Region_List)
Definition kls_region.c:335
KLS_Region_List kls_rl_delete(Koliseo *, KLS_list_element, KLS_Region_List)
Definition kls_region.c:375
void kls_usageReport(Koliseo *)
Print usage report for passed Koliseo to stdout.
Definition kls_region.c:675
KLS_Region_List kls_rl_diff(Koliseo *, KLS_Region_List, KLS_Region_List)
Definition kls_region.c:554
#define KLS_REGION_MAX_NAME_SIZE
Defines max size for KLS_Region's name field.
Definition kls_region.h:95
KLS_Region_List kls_rl_insord(Koliseo *, KLS_list_element, KLS_Region_List)
Definition kls_region.c:392
KLS_Region * KLS_list_element
Redundant typedef to better denote the actual value field of a KLS_region_list_item.
Definition kls_region.h:120
void kls_rl_showList(KLS_Region_List)
Definition kls_region.c:308
ptrdiff_t kls_type_usage(int, Koliseo *)
Calc memory used by the specific type of KLS_list_element.
Definition kls_region.c:687
KLS_region_list_item * KLS_Region_List
Definition kls_region.h:131
void KLS_autoregion_on_free(struct Koliseo *kls)
Definition kls_region.c:1440
ptrdiff_t kls_regionSize(KLS_list_element)
KLS_Region_List kls_rl_emptyList(void)
Definition kls_region.c:65
void kls_usageReport_toFile(Koliseo *, FILE *)
Prints an usage report for the passed Koliseo to the passed file.
Definition kls_region.c:644
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:58
@ KLS_REGLIST_ALLOC_KLS
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:201
bool kls_rl_empty(KLS_Region_List)
Definition kls_region.c:70
void KLS_autoregion_on_new(struct Koliseo *kls)
Definition kls_region.c:1352
KLS_Region_List kls_rl_mergeList(Koliseo *, KLS_Region_List, KLS_Region_List)
Definition kls_region.c:503
int kls_rl_length(KLS_Region_List)
Definition kls_region.c:326
void KLS_autoregion_on_temp_push(struct Koliseo_Temp *t_kls, ptrdiff_t padding, const char *caller, void *user)
Definition kls_region.c:1586
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:975
KLS_list_element kls_rl_head(KLS_Region_List)
Definition kls_region.c:79
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:1073
void kls_rl_freeList(KLS_Region_List)
Frees all values and nodes for passed Region list.
Definition kls_region.c:250
KLS_Region_Type
Represents a type index for Regions.
Definition kls_region.h:79
@ KLS_Header
Definition kls_region.h:82
@ KLS_None
Definition kls_region.h:80
@ Temp_KLS_Header
Definition kls_region.h:81
void kls_rl_showList_toFile(KLS_Region_List, FILE *fp)
Definition kls_region.c:269
KLS_Region_List kls_rl_copy(Koliseo *, KLS_Region_List)
Definition kls_region.c:362
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:1269
KLS_Region_List kls_rl_tail(KLS_Region_List)
Definition kls_region.c:88
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:1552
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:1457
void KLS_autoregion_on_temp_start(struct Koliseo_Temp *t_kls)
Definition kls_region.c:1478
ptrdiff_t kls_avg_regionSize(Koliseo *)
Return average region size in usage for the passed Koliseo.
Definition kls_region.c:610
bool kls_rl_member(KLS_list_element, KLS_Region_List)
Definition kls_region.c:313
const char * kls_reglist_backend_string(KLS_RegList_Alloc_Backend kls_be)
Returns the string corresponding to passed kls_be.
Definition kls_region.c:48
#define KLS_REGION_MAX_DESC_SIZE
Defines max size for KLS_Region's desc field.
Definition kls_region.h:100
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:1172
ptrdiff_t kls_total_padding(Koliseo *)
Calc memory used as padding for the passed Koliseo.
Definition kls_region.c:715
Definition kls_region.h:136
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:140
ptrdiff_t tkls_reglist_kls_size
Sets the size for reglist_kls when on KLS_REGLIST_ALLOC_KLS_BASIC.
Definition kls_region.h:142
KLS_RegList_Alloc_Backend kls_reglist_alloc_backend
Sets the backend for the KLS_Regions allocation.
Definition kls_region.h:138
KLS_RegList_Alloc_Backend tkls_reglist_alloc_backend
Sets the backend for the KLS_Regions allocation.
Definition kls_region.h:141
ptrdiff_t kls_reglist_kls_size
Sets the size for reglist_kls when on KLS_REGLIST_ALLOC_KLS_BASIC.
Definition kls_region.h:139
int kls_autoset_regions
If set to 1, make the Koliseo handle the KLS_Regions for its usage.
Definition kls_region.h:137
Definition kls_region.h:145
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:147
int max_regions_kls_alloc_basic
Contains maximum number of allocatable KLS_Region when using KLS_REGLIST_ALLOC_KLS_BASIC.
Definition kls_region.h:148
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:150
KLS_Region_List regs
List of allocated Regions.
Definition kls_region.h:146
KLS_Region_List t_regs
List of allocated Regions for a Koliseo_Temp instance.
Definition kls_region.h:149
KLS_Autoregion_Extension_Conf conf
Contains config for autoregion extension.
Definition kls_region.h:151
Represents an allocated memory region in a Koliseo.
Definition kls_region.h:107
int type
Used to identify which type the KLS_Region holds.
Definition kls_region.h:114
char desc[KLS_REGION_MAX_DESC_SIZE+1]
Description field for the KLS_Region.
Definition kls_region.h:113
ptrdiff_t end_offset
Ending offset of memory region.
Definition kls_region.h:109
ptrdiff_t begin_offset
Starting offset of memory region.
Definition kls_region.h:108
char name[KLS_REGION_MAX_NAME_SIZE+1]
Name field for the KLS_Region.
Definition kls_region.h:112
ptrdiff_t padding
Size of padding for the KLS_Region.
Definition kls_region.h:111
ptrdiff_t size
Size of memory for the KLS_Region.
Definition kls_region.h:110
Defines the node for a KLS_Region_List.
Definition kls_region.h:126
struct KLS_list_region * next
Pointer to the next node int the list.
Definition kls_region.h:128
KLS_list_element value
The KLS_Region value.
Definition kls_region.h:127