From 59d601629675080988dee970997da1dc4be1728d Mon Sep 17 00:00:00 2001 From: Simon Kellet Date: Fri, 11 Sep 2026 14:40:07 +0100 Subject: [PATCH] added debug with mem tracker --- main.odin | 51 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/main.odin b/main.odin index aa65bd9..de006b6 100644 --- a/main.odin +++ b/main.odin @@ -1,8 +1,9 @@ -#+vet explicit-allocators +//#+vet explicit-allocators package main import "core:fmt" import vmem "core:mem/virtual" +import "core:mem" import "core:os" import "core:strings" import "core:time" @@ -58,10 +59,36 @@ main :: proc() { arena_err := vmem.arena_init_growing(&arena) ensure(arena_err == nil) arena_alloc := vmem.arena_allocator(&arena) + context.allocator = arena_alloc defer vmem.arena_destroy(&arena) //clean up everything! - fleg.init_custom_allocator(arena_alloc) - defer fleg.destroy() + when ODIN_DEBUG { + total_size: int + track: mem.Tracking_Allocator + mem.tracking_allocator_init(&track, context.allocator) + context.allocator = mem.tracking_allocator(&track) + + defer { + if len(track.allocation_map) > 0 { + fmt.eprintf("=== %v allocations not freed: ===\n", len(track.allocation_map)) + for _, entry in track.allocation_map { + fmt.eprintf("- %v bytes @ %v\n", entry.size, entry.location) + total_size += entry.size + } + } + if len(track.bad_free_array) > 0 { + fmt.eprintf("=== %v incorrect frees: ===\n", len(track.bad_free_array)) + for entry in track.bad_free_array { + fmt.eprintf("- %p @ %v\n", entry.memory, entry.location) + } + } + fmt.printfln("[INFO] TOTAL: %v bytes at end of generation!", total_size) + mem.tracking_allocator_destroy(&track) + } + } + + fleg.init_custom_allocator(context.allocator) + //defer fleg.destroy() //not needede when we free the alloc' anyway directory: string output_dir: string @@ -72,30 +99,34 @@ main :: proc() { start := time.tick_now() //start timer for footer // First generate the blog index MARKDOWN file - generate_blog_index_md_file(directory, arena_alloc) + generate_blog_index_md_file(directory, context.allocator) // Walk directory and collect .md files - md_files := walk_tree_and_get_md_names(directory, arena_alloc) + md_files := walk_tree_and_get_md_names(directory, context.allocator) // ************* MAIN LOOP ************ for file, _ in md_files { if file == ".DS_Store" { continue } //Ignore annoying MacOS (TODO: clean up proc?) - md_filename := strings.split(file, directory, arena_alloc) + md_filename := strings.split(file, directory, context.allocator) trimmed_filename := strings.trim_right(md_filename[1], ".md") // sck: I am not sure if changing dir's is needed but I am now relying on it lol os.change_directory(directory) // turn all .md files into parsed .html files! - html_content, parse_err := parse_file_md_to_html(file, arena_alloc) + html_content, parse_err := parse_file_md_to_html(file, context.allocator) if parse_err != nil { fmt.eprintfln("ERROR: Could not parse file %s: %s", file, os.error_string(parse_err)) } - final_html_file, html_file_err := create_html_file(file, directory, output_dir, arena_alloc) + + final_html_file, html_file_err := create_html_file(file, directory, output_dir, context.allocator) + if html_file_err != nil { + fmt.eprintfln("ERROR: Could not create file %s: %s", file, os.error_string(html_file_err)) + } write_prefixs_to_html_file(final_html_file) os.write_string(final_html_file, html_content) //WRITE PAGE - defer write_footer_and_timings(trimmed_filename, final_html_file, start, arena_alloc) + defer write_footer_and_timings(trimmed_filename, final_html_file, start, context.allocator) } - free_all(arena_alloc) + defer free_all(context.allocator) }