21 .kls_collect_stats = 0,
23 .kls_block_while_has_temp = 1,
24 .kls_allow_zerocount_push = 0,
26 .kls_log_filepath =
"",
28#ifndef KOLISEO_HAS_LOCATE
33 .OOM_handler = &KLS_OOM_default_handler_dbg__,
34 .PTRDIFF_MAX_handler = &KLS_PTRDIFF_MAX_default_handler_dbg__,
35 .ZEROCOUNT_handler = &KLS_ZEROCOUNT_default_handler_dbg__,
48 .worst_pushcall_time = -1,
52static bool kls_set_conf(Koliseo * kls, KLS_Conf conf);
60 return KOLISEO_API_VERSION_STRING;
69 return KOLISEO_API_VERSION_INT;
81#ifndef KOLISEO_HAS_LOCATE
84void KLS_OOM_default_handler_dbg__(Koliseo* kls, ptrdiff_t available, ptrdiff_t padding, ptrdiff_t size, ptrdiff_t count, Koliseo_Loc loc)
87#ifndef KOLISEO_HAS_LOCATE
89 "[KLS] Out of memory. size*count [%td] was bigger than available-padding [%td].\n",
90 size * count, available - padding);
93 "[KLS] " KLS_Loc_Fmt
"Out of memory. size*count [%td] was bigger than available-padding [%td].\n",
95 size * count, available - padding);
101#ifndef KOLISEO_HAS_LOCATE
104void KLS_PTRDIFF_MAX_default_handler_dbg__(
struct Koliseo* kls, ptrdiff_t size, ptrdiff_t count, Koliseo_Loc loc)
108#ifndef KOLISEO_HAS_LOCATE
110 "[KLS] count [%td] was bigger than PTRDIFF_MAX/size [%li].\n",
111 count, PTRDIFF_MAX / size);
114 "[KLS] " KLS_Loc_Fmt
"count [%td] was bigger than PTRDIFF_MAX/size [%li].\n",
116 count, PTRDIFF_MAX / size);
119#ifndef KOLISEO_HAS_LOCATE
121 "[KLS] count [%td] was bigger than PTRDIFF_MAX/size [%lli].\n",
122 count, PTRDIFF_MAX / size);
125 "[KLS] " KLS_Loc_Fmt
"count [%td] was bigger than PTRDIFF_MAX/size [%lli].\n",
127 count, PTRDIFF_MAX / size);
143#ifndef KOLISEO_HAS_LOCATE
146void KLS_ZEROCOUNT_default_handler_dbg__(Koliseo* kls, ptrdiff_t available, ptrdiff_t padding, ptrdiff_t size, Koliseo_Loc loc)
149#ifndef KOLISEO_HAS_LOCATE
151 "[KLS] Doing a zero-count push. size [%td] padding [%td] available [%td].\n",
152 size, padding, available);
155 "[KLS] " KLS_Loc_Fmt
"Doing a zero-count push. size [%td] padding [%td] available [%td].\n",
157 size, padding, available);
168KLS_Conf
kls_conf_init_handled(
int autoset_regions,
int alloc_backend, ptrdiff_t reglist_kls_size,
int autoset_temp_regions,
int collect_stats,
int verbose_lvl,
int block_while_has_temp,
int allow_zerocount_push, FILE* log_fp,
const char* log_filepath, KLS_Err_Handlers err_handlers)
171 (void) autoset_regions;
172 (void) alloc_backend;
173 (void) reglist_kls_size;
174 (void) autoset_temp_regions;
175 res.kls_collect_stats = collect_stats;
176 res.kls_verbose_lvl = verbose_lvl;
177 res.kls_block_while_has_temp = block_while_has_temp;
178 res.kls_allow_zerocount_push = allow_zerocount_push;
179 res.kls_log_fp = log_fp;
180 res.kls_log_filepath = log_filepath;
182 if (err_handlers.OOM_handler != NULL) {
183 res.err_handlers.OOM_handler = err_handlers.OOM_handler;
185#ifndef KOLISEO_HAS_LOCATE
188 res.err_handlers.OOM_handler = &KLS_OOM_default_handler_dbg__;
192 if (err_handlers.PTRDIFF_MAX_handler != NULL) {
193 res.err_handlers.PTRDIFF_MAX_handler = err_handlers.PTRDIFF_MAX_handler;
195#ifndef KOLISEO_HAS_LOCATE
198 res.err_handlers.PTRDIFF_MAX_handler = &KLS_PTRDIFF_MAX_default_handler_dbg__;
202 if (err_handlers.ZEROCOUNT_handler != NULL) {
203 res.err_handlers.ZEROCOUNT_handler = err_handlers.ZEROCOUNT_handler;
205#ifndef KOLISEO_HAS_LOCATE
208 res.err_handlers.ZEROCOUNT_handler = &KLS_ZEROCOUNT_default_handler_dbg__;
219KLS_Conf
kls_conf_init(
int autoset_regions,
int alloc_backend, ptrdiff_t reglist_kls_size,
int autoset_temp_regions,
int collect_stats,
int verbose_lvl,
int block_while_has_temp,
int allow_zerocount_push, FILE* log_fp,
const char* log_filepath)
221 KLS_Err_Handlers err_handlers = KLS_DEFAULT_ERR_HANDLERS;
222 return kls_conf_init_handled(autoset_regions, alloc_backend, reglist_kls_size, autoset_temp_regions, collect_stats, verbose_lvl, block_while_has_temp, allow_zerocount_push, log_fp, log_filepath, err_handlers);
230#ifdef KOLISEO_HAS_LOCATE
231 bool kls_locate =
true;
233 bool kls_locate =
false;
236 bool kls_debug =
true;
238 bool kls_debug =
false;
240#ifdef KOLISEO_HAS_EXPER
241 bool kls_exper =
true;
243 bool kls_exper =
false;
250 int total_enabled = 0;
251 for (
int i=0; i<3; i++) {
256 fprintf(stderr,
"[KLS] Enabled features: {");
257 if (total_enabled == 0) {
258 fprintf(stderr,
"none}\n");
262 fprintf(stderr,
"debug%s", (total_enabled > 1 ?
", " :
""));
266 fprintf(stderr,
"locate%s", (total_enabled > 1 ?
", " :
""));
270 fprintf(stderr,
"exper");
272 fprintf(stderr,
"}\n");
292void kls_log(Koliseo *kls,
const char *tag,
const char *format, ...)
295 fprintf(stderr,
"[KLS] %s(): Passed kls was NULL.\n", __func__);
298 if (kls->conf.kls_verbose_lvl > 0) {
300 FILE *fp = kls->conf.kls_log_fp;
301 va_start(args, format);
304 "[KLS] %s(): Failed opening file to print logs.\n",
307 time_t now = time(0);
308 const struct tm *mytime = localtime(&now);
309 char timeheader[500];
310 if (strftime(timeheader,
sizeof timeheader,
"%X", mytime)) {
311 fprintf(fp,
"[%-10.10s] [%s] [", tag, timeheader);
312 vfprintf(fp, format, args);
337#ifndef KOLISEO_HAS_LOCATE
338Koliseo *
kls_new_alloc_ext(ptrdiff_t size, kls_alloc_func alloc_func, KLS_Hooks ext_handlers,
void* user)
340Koliseo *kls_new_alloc_ext_dbg(ptrdiff_t size, kls_alloc_func alloc_func, KLS_Hooks ext_handlers,
void* user, Koliseo_Loc loc)
343 if (size < (ptrdiff_t)
sizeof(Koliseo)) {
344#ifndef KOLISEO_HAS_LOCATE
346 "[ERROR] at %s(): invalid requested kls size (%td). Min accepted is: (%td).\n",
347 __func__, size, (ptrdiff_t)
sizeof(Koliseo));
350 "[ERROR] " KLS_Loc_Fmt
"%s(): invalid requested kls size (%td). Min accepted is: (%td).\n",
351 KLS_Loc_Arg(loc), __func__, size, (ptrdiff_t)
sizeof(Koliseo));
356 void *p = alloc_func(size);
365 kls->offset =
sizeof(*kls);
366 kls->prev_offset = kls->offset;
371 kls->conf.kls_log_fp = stderr;
372 kls->hooks = ext_handlers;
373 kls->extension_data = user;
375 kls_log(kls,
"KLS",
"API Level { %i } -> Allocated (%s) for new KLS.",
377 kls_log(kls,
"KLS",
"KLS offset: { %p }.", kls);
378 kls_log(kls,
"KLS",
"Allocation begin offset: { %p }.",
382 if (kls->hooks.on_new_handler != NULL) {
384 kls->hooks.on_new_handler(kls);
387#ifndef KOLISEO_HAS_LOCATE
388 fprintf(stderr,
"[KLS] Failed %s() call.\n", __func__);
390 fprintf(stderr,
"[KLS] " KLS_Loc_Fmt
"Failed %s() call.\n", KLS_Loc_Arg(loc), __func__);
395 Koliseo *kls_ref = p;
396 if (kls_ref->conf.kls_verbose_lvl > 0) {
418#ifndef KOLISEO_HAS_LOCATE
421Koliseo *kls_new_alloc_dbg(ptrdiff_t size, kls_alloc_func alloc_func, Koliseo_Loc loc)
424#ifndef KOLISEO_HAS_LOCATE
427 return kls_new_alloc_ext_dbg(size, alloc_func,
KLS_DEFAULT_HOOKS, KLS_DEFAULT_EXTENSION_DATA, loc);
446Koliseo *
kls_new_conf_alloc_ext(ptrdiff_t size, KLS_Conf conf, kls_alloc_func alloc_func, KLS_Hooks ext_handlers,
void* user)
449 bool conf_res = kls_set_conf(k, conf);
452 "[ERROR] [%s()]: Failed to set config for new Koliseo.\n",
495#ifndef KLS_DEBUG_CORE
497 "[WARN] %s(): KLS_DEBUG_CORE is not defined. No tracing allowed.\n",
500 KLS_Conf k = (KLS_Conf) {
501 .kls_collect_stats = 1,.kls_verbose_lvl =
502 1,.kls_log_filepath = output_path,
503#ifndef KOLISEO_HAS_LOCATE
507 .err_handlers.OOM_handler = (err_handlers.OOM_handler != NULL ? err_handlers.OOM_handler : &KLS_OOM_default_handler_dbg__),
508 .err_handlers.PTRDIFF_MAX_handler = ( err_handlers.PTRDIFF_MAX_handler != NULL ? err_handlers.PTRDIFF_MAX_handler : &KLS_PTRDIFF_MAX_default_handler_dbg__),
528 KLS_Err_Handlers err_handlers = KLS_DEFAULT_ERR_HANDLERS;
545#ifndef KLS_DEBUG_CORE
547 "[WARN] %s(): KLS_DEBUG_CORE is not defined. No debugging support.\n",
550 KLS_Conf k = (KLS_Conf) {
551 .kls_collect_stats = 1,.kls_verbose_lvl = 0,
552#ifndef KOLISEO_HAS_LOCATE
556 .err_handlers.OOM_handler = ( err_handlers.OOM_handler != NULL ? err_handlers.OOM_handler : &KLS_OOM_default_handler_dbg__),
557 .err_handlers.PTRDIFF_MAX_handler = ( err_handlers.PTRDIFF_MAX_handler != NULL ? err_handlers.PTRDIFF_MAX_handler : &KLS_PTRDIFF_MAX_default_handler_dbg__),
561 kls->conf.kls_verbose_lvl = 1;
577 KLS_Err_Handlers err_handlers = KLS_DEFAULT_ERR_HANDLERS;
587bool kls_set_conf(Koliseo *kls, KLS_Conf conf)
590 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo was NULL.\n", __func__);
596 if (kls->conf.kls_log_fp == NULL) {
597 kls->conf.kls_log_fp = stderr;
599#ifdef KLS_SETCONF_DEBUG
601 "[%s()]: Preliminary set of conf.kls_log_fp to stderr.",
607 if (conf.err_handlers.OOM_handler == NULL) {
609 "[ERROR] at %s(): passed OOM_handler is NULL. Using default.\n",
612#ifdef KLS_SETCONF_DEBUG
614 "[%s()]: Passed OOM_handler was NULL, using default.",
618#ifndef KOLISEO_HAS_LOCATE
621 kls->conf.err_handlers.OOM_handler = &KLS_OOM_default_handler_dbg__;
625 if (conf.err_handlers.PTRDIFF_MAX_handler == NULL) {
627 "[ERROR] at %s(): passed PTRDIFF_MAX_handler is NULL. Using default.\n",
630#ifdef KLS_SETCONF_DEBUG
632 "[%s()]: Passed PTRDIFF_MAX_handler was NULL, using default.",
636#ifndef KOLISEO_HAS_LOCATE
639 kls->conf.err_handlers.PTRDIFF_MAX_handler = &KLS_PTRDIFF_MAX_default_handler_dbg__;
643#ifndef KLS_DEBUG_CORE
644 if (kls->conf.kls_collect_stats == 1) {
646 "[WARN] [%s()]: KLS_DEBUG_CORE is not defined. Stats may not be collected in full.\n",
651 if (kls->conf.kls_verbose_lvl > 0) {
652 if (kls->conf.kls_log_fp != NULL) {
654#ifdef KLS_SETCONF_DEBUG
656 "[%s()]: kls->conf.kls_log_fp was not NULL. Overriding it.",
660 if (kls->conf.kls_collect_stats == 1) {
661 kls->stats.tot_hiccups += 1;
666 log_fp = fopen(kls->conf.kls_log_filepath,
"w");
669 "[ERROR] [%s()]: Failed opening logfile at {\"%s\"} [write].\n",
670 __func__, kls->conf.kls_log_filepath);
673 fprintf(log_fp,
"%s",
"");
676 log_fp = fopen(kls->conf.kls_log_filepath,
"a");
679 "[ERROR] [%s()]: Failed opening logfile at {\"%s\"} [append].\n",
680 __func__, kls->conf.kls_log_filepath);
683 kls->conf.kls_log_fp = log_fp;
701#ifndef KOLISEO_HAS_LOCATE
704int kls__check_available_failable_dbg(Koliseo* kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count,
const char* caller_name, Koliseo_Loc loc)
708 assert(caller_name != NULL);
710#ifndef KOLISEO_HAS_LOCATE
712 "[KLS] %s(): count [%td] was < 0.\n",
717 "[KLS] " KLS_Loc_Fmt
"%s(): count [%td] was < 0.\n",
725#ifndef KOLISEO_HAS_LOCATE
727 "[KLS] %s(): size [%td] was < 1.\n",
732 "[KLS] " KLS_Loc_Fmt
"%s(): size [%td] was < 1.\n",
740#ifndef KOLISEO_HAS_LOCATE
742 "[KLS] %s(): align [%td] was < 1.\n",
747 "[KLS] " KLS_Loc_Fmt
"%s(): align [%td] was < 1.\n",
754 if (! ((align & (align - 1)) == 0)) {
755#ifndef KOLISEO_HAS_LOCATE
757 "[KLS] %s(): align [%td] was not a power of 2.\n",
762 "[KLS] " KLS_Loc_Fmt
"%s(): align [%td] was not a power of 2.\n",
769 const ptrdiff_t available = kls->size - kls->offset;
770 const ptrdiff_t padding = -kls->offset & (align - 1);
771 bool ZEROCOUNT_happened =
false;
772 bool ZEROCOUNT_handled =
false;
774 if (kls->conf.kls_allow_zerocount_push != 1) {
775 ZEROCOUNT_happened =
true;
776 if (kls->conf.err_handlers.ZEROCOUNT_handler != NULL) {
777#ifndef KOLISEO_HAS_LOCATE
778 kls->conf.err_handlers.ZEROCOUNT_handler(kls, available, padding, size);
780 kls->conf.err_handlers.ZEROCOUNT_handler(kls, available, padding, size, loc);
782 ZEROCOUNT_handled =
true;
784#ifndef KOLISEO_HAS_LOCATE
786 "[KLS] %s(): Doing a zero-count push. size [%td] padding [%td] available [%td].\n",
788 size, padding, available);
791 "[KLS] " KLS_Loc_Fmt
"%s(): Doing a zero-count push. size [%td] padding [%td] available [%td].\n",
794 size, padding, available);
801 kls_log(kls,
"DEBUG",
"Accepting zero-count push: conf.kls_allow_zerocount_push was 1");
806 if (ZEROCOUNT_happened && ZEROCOUNT_handled) {
808 kls_log(kls,
"DEBUG",
"Requested a zero-count push while kls_allow_zerocount_push is not 1, but the error handler returned instead of exiting.");
810#ifndef KOLISEO_HAS_LOCATE
812 "[KLS] %s(): Doing a zero-count push. size [%td] padding [%td] available [%td].\n",
814 size, padding, available);
817 "[KLS] " KLS_Loc_Fmt
"%s(): Doing a zero-count push. size [%td] padding [%td] available [%td].\n",
820 size, padding, available);
826 bool OOM_happened =
false;
827 bool OOM_handled =
false;
828 bool PTRDIFF_MAX_happened =
false;
829 bool PTRDIFF_MAX_handled =
false;
830 if (count > PTRDIFF_MAX / size || available - padding < size * count) {
831 if (count > PTRDIFF_MAX / size) {
832 PTRDIFF_MAX_happened =
true;
833 if (kls->conf.err_handlers.PTRDIFF_MAX_handler != NULL) {
834#ifndef KOLISEO_HAS_LOCATE
835 kls->conf.err_handlers.PTRDIFF_MAX_handler(kls, size, count);
837 kls->conf.err_handlers.PTRDIFF_MAX_handler(kls, size, count, loc);
839 PTRDIFF_MAX_handled =
true;
842#ifndef KOLISEO_HAS_LOCATE
844 "[KLS] %s(): count [%td] was bigger than PTRDIFF_MAX/size [%li].\n",
846 count, PTRDIFF_MAX / size);
849 "[KLS] " KLS_Loc_Fmt
"%s(): count [%td] was bigger than PTRDIFF_MAX/size [%li].\n",
852 count, PTRDIFF_MAX / size);
855#ifndef KOLISEO_HAS_LOCATE
857 "[KLS] %s(): count [%td] was bigger than PTRDIFF_MAX/size [%lli].\n",
859 count, PTRDIFF_MAX / size);
862 "[KLS] " KLS_Loc_Fmt
"%s(): count [%td] was bigger than PTRDIFF_MAX/size [%lli].\n",
865 count, PTRDIFF_MAX / size);
871 if (kls->conf.err_handlers.OOM_handler != NULL) {
872#ifndef KOLISEO_HAS_LOCATE
873 kls->conf.err_handlers.OOM_handler(kls, available, padding, size, count);
875 kls->conf.err_handlers.OOM_handler(kls, available, padding, size, count, loc);
879#ifndef KOLISEO_HAS_LOCATE
881 "[KLS] %s(): Out of memory. size*count [%td] was bigger than available-padding [%td].\n",
883 size * count, available - padding);
886 "[KLS] " KLS_Loc_Fmt
"%s(): Out of memory. size*count [%td] was bigger than available-padding [%td].\n",
889 size * count, available - padding);
893 if (PTRDIFF_MAX_happened) {
894 if (kls->conf.err_handlers.PTRDIFF_MAX_handler && PTRDIFF_MAX_handled) {
895#ifndef KOLISEO_HAS_LOCATE
896 fprintf(stderr,
"[KLS] %s(): PTRDIFF_MAX fault happened and was handled.\n", caller_name);
898 kls_log(kls,
"DEBUG",
"%s(): PTRDIFF_MAX fault happened and was handled.", caller_name);
901 fprintf(stderr,
"[KLS] " KLS_Loc_Fmt
"%s(): PTRDIFF_MAX fault happened and was handled.\n", KLS_Loc_Arg(loc), caller_name);
903 kls_log(kls,
"DEBUG", KLS_Loc_Fmt
"%s(): PTRDIFF_MAX fault happened and was handled.", KLS_Loc_Arg(loc), caller_name);
908 }
else if (OOM_happened) {
909 if (kls->conf.err_handlers.PTRDIFF_MAX_handler && OOM_handled) {
910#ifndef KOLISEO_HAS_LOCATE
911 fprintf(stderr,
"[KLS] %s(): OOM fault happened and was handled.\n", caller_name);
913 kls_log(kls,
"DEBUG",
"%s(): OOM fault happened and was handled.", caller_name);
916 fprintf(stderr,
"[KLS] " KLS_Loc_Fmt
"%s(): OOM fault happened and was handled.\n", KLS_Loc_Arg(loc), caller_name);
918 kls_log(kls,
"DEBUG", KLS_Loc_Fmt
"%s(): OOM fault happened and was handled.", KLS_Loc_Arg(loc), caller_name);
924#ifndef KOLISEO_HAS_LOCATE
925 fprintf(stderr,
"[KLS] Failed %s() call.\n", caller_name);
927 fprintf(stderr,
"[KLS] " KLS_Loc_Fmt
"Failed %s() call.\n", KLS_Loc_Arg(loc), caller_name);
944void *
kls_push(Koliseo *kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count)
949 struct timespec start_time, end_time;
950 clock_gettime(CLOCK_MONOTONIC, &start_time);
952 LARGE_INTEGER start_time, end_time, frequency;
953 QueryPerformanceFrequency(&frequency);
954 QueryPerformanceCounter(&start_time);
959 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo was NULL.\n", __func__);
962 if ((kls->has_temp == 1) && (kls->conf.kls_block_while_has_temp == 1)) {
963 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo has an open Koliseo_Temp session.\n", __func__);
965 kls_log(kls,
"ERROR",
"[%s()]: Passed Koliseo has an open Koliseo_Temp session.", __func__);
970#ifndef KOLISEO_HAS_LOCATE
971 kls__check_available(kls, size, align, count);
973 kls__check_available_dbg(kls, size, align, count, KLS_HERE);
975 ptrdiff_t padding = -kls->offset & (align - 1);
976 char *p = kls->data + kls->offset + padding;
977 kls->prev_offset = kls->offset;
978 kls->offset += padding + size * count;
984 kls_log(kls,
"KLS",
"Curr offset: { %p }.", kls + kls->offset);
985 kls_log(kls,
"KLS",
"API Level { %i } -> Pushed size (%s) for KLS.",
987 if (kls->conf.kls_verbose_lvl > 0) {
990 if (kls->conf.kls_collect_stats == 1) {
992 clock_gettime(CLOCK_MONOTONIC, &end_time);
993 double elapsed_time =
994 (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_nsec -
995 start_time.tv_nsec) / 1e9;
997 QueryPerformanceCounter(&end_time);
998 double elapsed_time =
999 (double)(end_time.QuadPart -
1000 start_time.QuadPart) / frequency.QuadPart;
1002 if (elapsed_time > kls->stats.worst_pushcall_time) {
1003 kls->stats.worst_pushcall_time = elapsed_time;
1007 if (kls->conf.kls_collect_stats == 1) {
1008 kls->stats.tot_pushes += 1;
1022#ifndef KOLISEO_HAS_LOCATE
1026void *kls_push_zero_dbg(Koliseo *kls, ptrdiff_t size, ptrdiff_t align,
1027 ptrdiff_t count, Koliseo_Loc loc)
1031#ifdef KLS_DEBUG_CORE
1033 struct timespec start_time, end_time;
1034 clock_gettime(CLOCK_MONOTONIC, &start_time);
1036 LARGE_INTEGER start_time, end_time, frequency;
1037 QueryPerformanceFrequency(&frequency);
1038 QueryPerformanceCounter(&start_time);
1043 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo was NULL.\n", __func__);
1046 if ((kls->has_temp == 1) && (kls->conf.kls_block_while_has_temp == 1)) {
1047#ifndef KOLISEO_HAS_LOCATE
1048 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo has an open Koliseo_Temp session.\n", __func__);
1050 fprintf(stderr,
"[ERROR] " KLS_Loc_Fmt
"[%s()]: Passed Koliseo has an open Koliseo_Temp session.\n", KLS_Loc_Arg(loc), __func__);
1051 kls_log(kls,
"ERROR", KLS_Loc_Fmt
"[%s()]: Passed Koliseo has an open Koliseo_Temp session.", KLS_Loc_Arg(loc), __func__);
1056#ifndef KOLISEO_HAS_LOCATE
1057 kls__check_available(kls, size, align, count);
1059 kls__check_available_dbg(kls, size, align, count, loc);
1062 ptrdiff_t padding = -kls->offset & (align - 1);
1063 char *p = kls->data + kls->offset + padding;
1065 memset(p, 0, size * count);
1066 kls->prev_offset = kls->offset;
1067 kls->offset += padding + size * count;
1072#ifdef KLS_DEBUG_CORE
1073 kls_log(kls,
"KLS",
"Curr offset: { %p }.", kls + kls->offset);
1074 kls_log(kls,
"KLS",
"API Level { %i } -> Pushed zeroes, size (%s) for KLS.",
1076 if (kls->conf.kls_verbose_lvl > 0) {
1079 if (kls->conf.kls_collect_stats == 1) {
1081 clock_gettime(CLOCK_MONOTONIC, &end_time);
1082 double elapsed_time =
1083 (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_nsec -
1084 start_time.tv_nsec) / 1e9;
1086 QueryPerformanceCounter(&end_time);
1087 double elapsed_time =
1088 (double)(end_time.QuadPart -
1089 start_time.QuadPart) / frequency.QuadPart;
1091 if (elapsed_time > kls->stats.worst_pushcall_time) {
1092 kls->stats.worst_pushcall_time = elapsed_time;
1096 if (kls->conf.kls_collect_stats == 1) {
1097 kls->stats.tot_pushes += 1;
1111#ifndef KOLISEO_HAS_LOCATE
1115void *kls_push_zero_ext_dbg(Koliseo *kls, ptrdiff_t size, ptrdiff_t align,
1116 ptrdiff_t count, Koliseo_Loc loc)
1120#ifdef KLS_DEBUG_CORE
1122 struct timespec start_time, end_time;
1123 clock_gettime(CLOCK_MONOTONIC, &start_time);
1125 LARGE_INTEGER start_time, end_time, frequency;
1126 QueryPerformanceFrequency(&frequency);
1127 QueryPerformanceCounter(&start_time);
1132 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo was NULL.\n", __func__);
1135 if ((kls->has_temp == 1) && (kls->conf.kls_block_while_has_temp == 1)) {
1136#ifndef KOLISEO_HAS_LOCATE
1137 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo has an open Koliseo_Temp session.\n", __func__);
1139 fprintf(stderr,
"[ERROR] " KLS_Loc_Fmt
"[%s()]: Passed Koliseo has an open Koliseo_Temp session.\n", KLS_Loc_Arg(loc), __func__);
1140 kls_log(kls,
"ERROR", KLS_Loc_Fmt
"[%s()]: Passed Koliseo has an open Koliseo_Temp session.", KLS_Loc_Arg(loc), __func__);
1146#ifndef KOLISEO_HAS_LOCATE
1147 kls__check_available(kls, size, align, count);
1149 kls__check_available_dbg(kls, size, align, count, loc);
1151 ptrdiff_t padding = -kls->offset & (align - 1);
1152 char *p = kls->data + kls->offset + padding;
1154 memset(p, 0, size * count);
1155 kls->prev_offset = kls->offset;
1156 kls->offset += padding + size * count;
1158 if (kls->hooks.on_push_handler != NULL) {
1176 kls->hooks.on_push_handler(kls, padding, __func__, NULL);
1183#ifdef KLS_DEBUG_CORE
1184 kls_log(kls,
"KLS",
"Curr offset: { %p }.", kls + kls->offset);
1185 kls_log(kls,
"KLS",
"API Level { %i } -> Pushed zeroes, size (%s) for KLS.",
1187 if (kls->conf.kls_verbose_lvl > 0) {
1190 if (kls->conf.kls_collect_stats == 1) {
1192 clock_gettime(CLOCK_MONOTONIC, &end_time);
1193 double elapsed_time =
1194 (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_nsec -
1195 start_time.tv_nsec) / 1e9;
1197 QueryPerformanceCounter(&end_time);
1198 double elapsed_time =
1199 (double)(end_time.QuadPart -
1200 start_time.QuadPart) / frequency.QuadPart;
1202 if (elapsed_time > kls->stats.worst_pushcall_time) {
1203 kls->stats.worst_pushcall_time = elapsed_time;
1207 if (kls->conf.kls_collect_stats == 1) {
1208 kls->stats.tot_pushes += 1;
1223#ifndef KOLISEO_HAS_LOCATE
1225 ptrdiff_t align, ptrdiff_t count)
1227void *kls_temp_push_zero_ext_dbg(Koliseo_Temp *t_kls, ptrdiff_t size,
1228 ptrdiff_t align, ptrdiff_t count, Koliseo_Loc loc)
1232#ifdef KLS_DEBUG_CORE
1234 struct timespec start_time, end_time;
1235 clock_gettime(CLOCK_MONOTONIC, &start_time);
1237 LARGE_INTEGER start_time, end_time, frequency;
1238 QueryPerformanceFrequency(&frequency);
1239 QueryPerformanceCounter(&start_time);
1243 if (t_kls == NULL) {
1244 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo_Temp was NULL.\n",
1248 Koliseo *kls = t_kls->kls;
1250 fprintf(stderr,
"[ERROR] [%s()]: Referred Koliseo was NULL.\n",
1254#ifndef KOLISEO_HAS_LOCATE
1255 kls__check_available(kls, size, align, count);
1257 kls__check_available_dbg(kls, size, align, count, loc);
1259 ptrdiff_t padding = -kls->offset & (align - 1);
1260 char *p = kls->data + kls->offset + padding;
1262 memset(p, 0, size * count);
1263 kls->prev_offset = kls->offset;
1264 kls->offset += padding + size * count;
1266 if (kls->hooks.on_temp_push_handler != NULL) {
1268 kls->hooks.on_temp_push_handler(t_kls, padding, __func__, NULL);
1275#ifdef KLS_DEBUG_CORE
1276 if (kls->conf.kls_collect_stats == 1) {
1278 clock_gettime(CLOCK_MONOTONIC, &end_time);
1279 double elapsed_time =
1280 (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_nsec -
1281 start_time.tv_nsec) / 1e9;
1283 QueryPerformanceCounter(&end_time);
1284 double elapsed_time =
1285 (double)(end_time.QuadPart -
1286 start_time.QuadPart) / frequency.QuadPart;
1288 if (elapsed_time > kls->stats.worst_pushcall_time) {
1289 kls->stats.worst_pushcall_time = elapsed_time;
1292 kls_log(kls,
"KLS",
"Curr offset: { %p }.", kls + kls->offset);
1294 "API Level { %i } -> Pushed zeroes, size (%s) for Temp_KLS.",
1296 if (kls->conf.kls_verbose_lvl > 0) {
1300 if (kls->conf.kls_collect_stats == 1) {
1301 kls->stats.tot_temp_pushes += 1;
1314 fprintf(stderr,
"print_kls_2file(): fp was NULL.\n");
1318 fprintf(fp,
"[KLS] kls was NULL.\n");
1321 fprintf(fp,
"\n[INFO] Conf: { " KLS_Conf_Fmt
" }\n",
1322 KLS_Conf_Arg(kls->conf));
1323 fprintf(fp,
"\n[INFO] Stats: { " KLS_Stats_Fmt
" }\n",
1324 KLS_Stats_Arg(kls->stats));
1325 fprintf(fp,
"\n[KLS] Size: { %td }\n", kls->size);
1326 char human_size[200];
1327 char curr_size[200];
1329 fprintf(fp,
"[KLS] Size (Human): { %s }\n", human_size);
1331 fprintf(fp,
"[KLS] Used (Human): { %s }\n", curr_size);
1332 fprintf(fp,
"[KLS] Offset: { %td }\n", kls->offset);
1333 fprintf(fp,
"[KLS] Prev_Offset: { %td }\n", kls->prev_offset);
1345 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo was NULL.\n", __func__);
1359 fprintf(stderr,
"print_temp_kls_2file(): fp was NULL.\n");
1362 if (t_kls == NULL) {
1363 fprintf(fp,
"[KLS_T] t_kls was NULL.");
1364 }
else if (t_kls->kls == NULL) {
1365 fprintf(fp,
"[KLS_T] [%s()]: Referred Koliseo was NULL.\n", __func__);
1367 const Koliseo *kls = t_kls->kls;
1369 fprintf(fp,
"\n[KLS_T] Temp Size: { %td }\n",
1370 kls->size - t_kls->offset);
1371 fprintf(fp,
"\n[KLS_T] Refer Size: { %td }\n", kls->size);
1372 char human_size[200];
1373 char curr_size[200];
1375 sizeof(human_size));
1376 fprintf(fp,
"[KLS_T] Temp Size Human: { %s }\n", human_size);
1378 fprintf(fp,
"[KLS_T] Refer Size Human: { %s }\n", human_size);
1380 fprintf(fp,
"[KLS_T] Inner Used (Human): { %s }\n", curr_size);
1382 fprintf(fp,
"[KLS_T] Temp Used (Human): { %s }\n", curr_size);
1383 fprintf(fp,
"[KLS_T] Inner Offset: { %td }\n", kls->offset);
1384 fprintf(fp,
"[KLS_T] Temp Offset: { %td }\n", t_kls->offset);
1385 fprintf(fp,
"[KLS_T] Inner Prev_Offset: { %td }\n", kls->prev_offset);
1386 fprintf(fp,
"[KLS_T] Temp Prev_Offset: { %td }\n\n",
1387 t_kls->prev_offset);
1409 const char *units[] =
1410 {
"bytes",
"KB",
"MB",
"GB",
"TB",
"PB",
"EB",
"ZB",
"YB" };
1411 const int numUnits =
sizeof(units) /
sizeof(units[0]);
1414 double sizeValue = (double)size;
1416 while (sizeValue >= 1000 && unitIndex < numUnits - 1) {
1421 snprintf(outputBuffer, bufferSize,
"%.2f %s", sizeValue, units[unitIndex]);
1432 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo was NULL.\n", __func__);
1436 kls->prev_offset = kls->offset;
1437 kls->offset =
sizeof(*kls);
1438#ifdef KLS_DEBUG_CORE
1439 kls_log(kls,
"KLS",
"API Level { %i } -> Cleared offsets for KLS.",
1452 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo was NULL.\n", __func__);
1455 if (kls->hooks.on_free_handler != NULL) {
1457 kls->hooks.on_free_handler(kls);
1459 if (kls->has_temp == 1) {
1460#ifdef KLS_DEBUG_CORE
1462 "API Level { %i } -> KLS had an active Koliseo_Temp.",
1468#ifdef KLS_DEBUG_CORE
1469 kls_log(kls,
"KLS",
"API Level { %i } -> Freeing KLS.",
1472 if (kls->conf.kls_log_fp != NULL && kls->conf.kls_log_fp != stdout
1473 && kls->conf.kls_log_fp != stderr) {
1474#ifdef KLS_DEBUG_CORE
1475 kls_log(kls,
"KLS",
"Closing kls log file. Path: {\"%s\"}.",
1476 kls->conf.kls_log_filepath);
1478 int close_res = fclose(kls->conf.kls_log_fp);
1479 if (close_res != 0) {
1481 "[ERROR] %s(): Failed fclose() on log_fp. Path: {\"%s\"}.",
1482 __func__, kls->conf.kls_log_filepath);
1484 }
else if (kls->conf.kls_log_fp == stdout || kls->conf.kls_log_fp == stderr) {
1485 if (kls->conf.kls_verbose_lvl > 1) {
1487 "[INFO] %s(): kls->conf.kls_log_fp is %s. Not closing it.\n",
1489 (kls->conf.kls_log_fp == stdout ?
"stdout" :
"stderr"));
1502#ifndef KOLISEO_HAS_LOCATE
1505Koliseo_Temp *kls_temp_start_dbg(Koliseo *kls, Koliseo_Loc loc)
1509 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo was NULL.\n", __func__);
1512 if (kls->has_temp != 0) {
1514 "[ERROR] [%s()]: Passed Koliseo->has_temp is not 0. {%i}\n",
1515 __func__, kls->has_temp);
1516#ifdef KLS_DEBUG_CORE
1517 kls_log(kls,
"ERROR",
"[%s()]: Passed Koliseo->has_temp != 0 . {%i}",
1518 __func__, kls->has_temp);
1520 if (kls->conf.kls_collect_stats == 1) {
1521 kls->stats.tot_hiccups += 1;
1525 ptrdiff_t prev = kls->prev_offset;
1526 ptrdiff_t off = kls->offset;
1528 Koliseo_Temp *tmp = KLS_PUSH(kls, Koliseo_Temp);
1530 tmp->prev_offset = prev;
1532#ifdef KLS_DEBUG_CORE
1533 kls_log(kls,
"INFO",
"Passed kls conf: " KLS_Conf_Fmt
"\n",
1534 KLS_Conf_Arg(kls->conf));
1539 if (kls->hooks.on_temp_start_handler != NULL) {
1541 kls->hooks.on_temp_start_handler(tmp);
1543#ifdef KLS_DEBUG_CORE
1544 kls_log(kls,
"KLS",
"Prepared new Temp KLS.");
1555 if (tmp_kls == NULL) {
1556 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo_Temp was NULL.\n",
1561 Koliseo *kls_ref = tmp_kls->kls;
1562 if (kls_ref == NULL) {
1563 fprintf(stderr,
"[ERROR] [%s()]: Referred Koliseo was NULL.\n",
1568 if (kls_ref->hooks.on_temp_free_handler != NULL) {
1570 kls_ref->hooks.on_temp_free_handler(tmp_kls);
1573#ifdef KLS_DEBUG_CORE
1574 kls_log(kls_ref,
"KLS",
"Ended Temp KLS.");
1576 tmp_kls->kls->has_temp = 0;
1577 tmp_kls->kls->t_kls = NULL;
1578 tmp_kls->kls->prev_offset = tmp_kls->prev_offset;
1579 tmp_kls->kls->offset = tmp_kls->offset;
1581 if (kls_ref->conf.kls_collect_stats == 1) {
1582 kls_ref->stats.tot_temp_pushes = 0;
1583 kls_ref->stats.tot_temp_pops = 0;
1587#ifdef KOLISEO_HAS_EXPER
1596void *
kls_pop(Koliseo *kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count)
1599 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo was NULL.\n", __func__);
1602 ptrdiff_t padding = -kls->offset & (align - 1);
1603 if (count > PTRDIFF_MAX / size
1604 || (kls->size + kls->offset) < (size * count)) {
1605 fprintf(stderr,
"[KLS] Failed %s() call.\n", __func__);
1609 char *p = kls->data + kls->offset - padding - size * count;
1610 kls->prev_offset = kls->offset;
1611 kls->offset -= padding + size * count;
1612#ifdef KLS_DEBUG_CORE
1613 kls_log(kls,
"KLS",
"API Level { %i } -> Popped (%li) for KLS.",
1615 if (kls->conf.kls_verbose_lvl > 0) {
1619 if (kls->conf.kls_collect_stats == 1) {
1620 kls->stats.tot_pops += 1;
1633void *
kls_pop_AR(Koliseo *kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count)
1636 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo was NULL.\n", __func__);
1639 ptrdiff_t padding = -kls->offset & (align - 1);
1640 if (count > PTRDIFF_MAX / size
1641 || (kls->size + kls->offset) < (size * count)) {
1642 fprintf(stderr,
"[KLS] Failed %s() call.\n", __func__);
1646 char *p = kls->data + kls->offset - padding - size * count;
1647 kls->prev_offset = kls->offset;
1648 kls->offset -= padding + size * count;
1649#ifdef KLS_DEBUG_CORE
1650 kls_log(kls,
"KLS",
"API Level { %i } -> Popped (%li) for KLS.",
1652 if (kls->conf.kls_verbose_lvl > 0) {
1656 if (kls->conf.kls_collect_stats == 1) {
1657 kls->stats.tot_pops += 1;
1673 if (t_kls == NULL) {
1674 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo_Temp was NULL.\n",
1678 Koliseo *kls = t_kls->kls;
1680 fprintf(stderr,
"[ERROR] [%s()]: Referred Koliseo was NULL.\n",
1684 ptrdiff_t padding = -kls->offset & (align - 1);
1685 if (count > PTRDIFF_MAX / size
1686 || (kls->size + kls->offset) < (size * count)) {
1687 fprintf(stderr,
"[KLS] Failed %s() call.\n", __func__);
1691 char *p = kls->data + kls->offset - padding - size * count;
1692 kls->prev_offset = kls->offset;
1693 kls->offset -= padding + size * count;
1694#ifdef KLS_DEBUG_CORE
1695 kls_log(kls,
"KLS",
"Curr offset: { %p }.", kls + kls->offset);
1696 kls_log(kls,
"KLS",
"API Level { %i } -> Popped (%li) for Temp_KLS.",
1698 if (kls->conf.kls_verbose_lvl > 0) {
1702 if (kls->conf.kls_collect_stats == 1) {
1703 kls->stats.tot_temp_pops += 1;
1716void *
kls_temp_pop_AR(Koliseo_Temp *t_kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count)
1718 if (t_kls == NULL) {
1719 fprintf(stderr,
"[ERROR] [%s()]: Passed Koliseo_Temp was NULL.\n",
1723 Koliseo *kls = t_kls->kls;
1725 fprintf(stderr,
"[ERROR] [%s()]: Referred Koliseo was NULL.\n",
1729 ptrdiff_t padding = -kls->offset & (align - 1);
1730 if (count > PTRDIFF_MAX / size
1731 || (kls->size + kls->offset) < (size * count)) {
1732 fprintf(stderr,
"[KLS] Failed %s() call.\n", __func__);
1736 char *p = kls->data + kls->offset - padding - size * count;
1737 kls->prev_offset = kls->offset;
1738 kls->offset -= padding + size * count;
1739#ifdef KLS_DEBUG_CORE
1740 kls_log(kls,
"KLS",
"Curr offset: { %p }.", kls + kls->offset);
1741 kls_log(kls,
"KLS",
"API Level { %i } -> Popped (%li) for Temp_KLS.",
1743 if (kls->conf.kls_verbose_lvl > 0) {
1747 if (kls->conf.kls_collect_stats == 1) {
1748 kls->stats.tot_temp_pops += 1;
1761 char* dest = KLS_PUSH_STR(kls, source);
1762 KLS__STRCPY(dest, source);
1774 char** strings = NULL;
1775 strings = KLS_PUSH_ARR(kls,
char*, count);
1776 for (
int i=0; i < count; i++) {
1777 strings[i] = KLS_STRDUP(kls, source[i]);
1790 char* dest = KLS_PUSH_STR_T(t_kls, source);
1791 KLS__STRCPY(dest, source);
1803 char** strings = NULL;
1804 strings = KLS_PUSH_ARR_T(t_kls,
char*, count);
1805 for (
int i=0; i < count; i++) {
1806 strings[i] = KLS_STRDUP_T(t_kls, source[i]);
#define KLS_DEFAULT_HOOKS
Definition kls_region.h:161
char * kls_strdup(Koliseo *kls, char *source)
Function to dupe a C string to a Koliseo, and return a pointer to the allocated string.
Definition koliseo.c:1759
void * kls_temp_pop(Koliseo_Temp *t_kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count)
Takes a Koliseo_Temp, and ptrdiff_t values for size, align and count.
Definition koliseo.c:1670
Koliseo_Temp * kls_temp_start(Koliseo *kls)
Starts a new savestate for the passed Koliseo pointer, by initialising its Koliseo_Temp pointer and r...
Definition koliseo.c:1503
void print_dbg_temp_kls(const Koliseo_Temp *t_kls)
Prints header fields from the passed Koliseo_Temp pointer, to stderr.
Definition koliseo.c:1395
void print_temp_kls_2file(FILE *fp, const Koliseo_Temp *t_kls)
Prints header fields from the passed Koliseo_Temp pointer, to the passed FILE pointer.
Definition koliseo.c:1356
char * kls_t_strdup(Koliseo_Temp *t_kls, char *source)
Function to dupe a C string to a Koliseo_Temp, and return a pointer to the allocated string.
Definition koliseo.c:1788
KLS_Stats KLS_STATS_DEFAULT
Definition koliseo.c:40
void kls_log(Koliseo *kls, const char *tag, const char *format,...)
Logs a message to the log_fp FILE field of the passed Koliseo pointer, if its conf....
Definition koliseo.c:292
void kls_temp_end(Koliseo_Temp *tmp_kls)
Ends passed Koliseo_Temp pointer.
Definition koliseo.c:1553
void kls_dbg_features(void)
Prints enabled Koliseo features to stderr.
Definition koliseo.c:228
char ** kls_strdup_arr(Koliseo *kls, size_t count, char **source)
Function to dupe a C string array to a Koliseo, and return a pointer to the allocated array.
Definition koliseo.c:1772
void * kls_temp_push_zero_ext(Koliseo_Temp *t_kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count)
Takes a Koliseo_Temp, and ptrdiff_t values for size, align and count.
Definition koliseo.c:1224
void print_dbg_kls(const Koliseo *kls)
Prints header fields from the passed Koliseo pointer, to stderr.
Definition koliseo.c:1342
const char * string_koliseo_version(void)
Returns the constant string representing current version for Koliseo.
Definition koliseo.c:58
Koliseo * kls_new_dbg_alloc(ptrdiff_t size, kls_alloc_func alloc_func)
Takes a ptrdiff_t size and an allocation function pointer, and returns a pointer to the prepared Koli...
Definition koliseo.c:575
ptrdiff_t kls_get_pos(const Koliseo *kls)
Returns the current offset (position of pointer bumper) for the passed Koliseo.
Definition koliseo.c:281
void * kls_temp_pop_AR(Koliseo_Temp *t_kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count)
Takes a Koliseo_Temp, and ptrdiff_t values for size, align and count.
Definition koliseo.c:1716
void * kls_pop_AR(Koliseo *kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count)
Takes a Koliseo pointer, and ptrdiff_t values for size, align and count.
Definition koliseo.c:1633
Koliseo * kls_new_conf_alloc(ptrdiff_t size, KLS_Conf conf, kls_alloc_func alloc_func)
Takes a ptrdiff_t size, a KLS_Conf to configure the new Koliseo, and an allocation function pointer.
Definition koliseo.c:474
void kls_free(Koliseo *kls)
Calls kls_clear() on the passed Koliseo pointer and the frees the actual Koliseo.
Definition koliseo.c:1449
Koliseo * kls_new_traced_alloc(ptrdiff_t size, const char *output_path, kls_alloc_func alloc_func)
Takes a ptrdiff_t size, a filepath for the trace output file, and an allocation function pointer.
Definition koliseo.c:526
char ** kls_t_strdup_arr(Koliseo_Temp *t_kls, size_t count, char **source)
Function to dupe a C string array to a Koliseo_Temp, and return a pointer to the allocated array.
Definition koliseo.c:1801
void * kls_push(Koliseo *kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count)
Takes a Koliseo pointer, and ptrdiff_t values for size, align and count.
Definition koliseo.c:944
Koliseo * kls_new_dbg_alloc_handled(ptrdiff_t size, kls_alloc_func alloc_func, KLS_Err_Handlers err_handlers)
Takes a ptrdiff_t size and an allocation function pointer, and returns a pointer to the prepared Koli...
Definition koliseo.c:543
void * kls_push_zero(Koliseo *kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count)
Takes a Koliseo pointer, and ptrdiff_t values for size, align and count.
Definition koliseo.c:1023
int kls__check_available_failable(Koliseo *kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count, const char *caller_name)
Takes a Koliseo, a ptrdiff_t size, align and count, and a caller name.
Definition koliseo.c:702
Koliseo * kls_new_alloc(ptrdiff_t size, kls_alloc_func alloc_func)
Takes a ptrdiff_t size and a function pointer to the allocation function.
Definition koliseo.c:419
void * kls_pop(Koliseo *kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count)
Takes a Koliseo pointer, and ptrdiff_t values for size, align and count.
Definition koliseo.c:1596
void KLS_PTRDIFF_MAX_default_handler__(struct Koliseo *kls, ptrdiff_t size, ptrdiff_t count)
Definition koliseo.c:102
KLS_Conf KLS_DEFAULT_CONF
Config used by any new Koliseo by default.
Definition koliseo.c:20
void KLS_ZEROCOUNT_default_handler__(Koliseo *kls, ptrdiff_t available, ptrdiff_t padding, ptrdiff_t size)
Used internally for handling zero-count in push calls when no user handler is provided.
Definition koliseo.c:144
Koliseo * kls_new_conf_alloc_ext(ptrdiff_t size, KLS_Conf conf, kls_alloc_func alloc_func, KLS_Hooks ext_handlers, void *user)
Takes a ptrdiff_t size, a KLS_Conf to configure the new Koliseo, and an allocation function pointer.
Definition koliseo.c:446
Koliseo * kls_new_traced_alloc_handled(ptrdiff_t size, const char *output_path, kls_alloc_func alloc_func, KLS_Err_Handlers err_handlers)
Takes a ptrdiff_t size, a filepath for the trace output file, and an allocation function pointer.
Definition koliseo.c:492
KLS_Conf kls_conf_init(int autoset_regions, int alloc_backend, ptrdiff_t reglist_kls_size, int autoset_temp_regions, int collect_stats, int verbose_lvl, int block_while_has_temp, int allow_zerocount_push, FILE *log_fp, const char *log_filepath)
Used to prepare a KLS_Conf without caring about KOLISEO_HAS_REGIONS.
Definition koliseo.c:219
void print_kls_2file(FILE *fp, const Koliseo *kls)
Prints header fields from the passed Koliseo pointer, to the passed FILE pointer.
Definition koliseo.c:1311
KLS_Conf kls_conf_init_handled(int autoset_regions, int alloc_backend, ptrdiff_t reglist_kls_size, int autoset_temp_regions, int collect_stats, int verbose_lvl, int block_while_has_temp, int allow_zerocount_push, FILE *log_fp, const char *log_filepath, KLS_Err_Handlers err_handlers)
Used to prepare a KLS_Conf without caring about KOLISEO_HAS_REGIONS.
Definition koliseo.c:168
Koliseo * kls_new_alloc_ext(ptrdiff_t size, kls_alloc_func alloc_func, KLS_Hooks ext_handlers, void *user)
Takes a ptrdiff_t size and a function pointer to the allocation function.
Definition koliseo.c:338
void kls_clear(Koliseo *kls)
Resets the offset field for the passed Koliseo pointer.
Definition koliseo.c:1429
void * kls_push_zero_ext(Koliseo *kls, ptrdiff_t size, ptrdiff_t align, ptrdiff_t count)
Takes a Koliseo pointer, and ptrdiff_t values for size, align and count.
Definition koliseo.c:1112
void kls_formatSize(ptrdiff_t size, char *outputBuffer, size_t bufferSize)
Converts a ptrdiff_t size to human-readable SI units (modulo 1000).
Definition koliseo.c:1407
void KLS_OOM_default_handler__(Koliseo *kls, ptrdiff_t available, ptrdiff_t padding, ptrdiff_t size, ptrdiff_t count)
Used internally for handling Out-Of-Memory in push calls when no user handler is provided.
Definition koliseo.c:82
int int_koliseo_version(void)
Returns the constant int representing current version for Koliseo.
Definition koliseo.c:67