From 37da2ea068bc96e5a925e7d7dcecf9e1cb0694f0 Mon Sep 17 00:00:00 2001 From: Zachary Levy Date: Wed, 22 Apr 2026 06:03:10 +0000 Subject: [PATCH] Tweaked general setup tracking allocator and added logger (#11) Co-authored-by: Zachary Levy Reviewed-on: https://git.bfpower.io/BFPOWER/levlib/pulls/11 --- draw/examples/{main.odin => examples.odin} | 30 +++---- meta/main.odin | 44 ++++++++++ qrcode/examples/examples.odin | 32 ++++--- vendor/lmdb/examples/examples.odin | 97 ++++++++++++++++------ 4 files changed, 141 insertions(+), 62 deletions(-) rename draw/examples/{main.odin => examples.odin} (67%) diff --git a/draw/examples/main.odin b/draw/examples/examples.odin similarity index 67% rename from draw/examples/main.odin rename to draw/examples/examples.odin index e3ee109..c75d49a 100644 --- a/draw/examples/main.odin +++ b/draw/examples/examples.odin @@ -1,19 +1,18 @@ package examples import "core:fmt" +import "core:log" import "core:mem" import "core:os" main :: proc() { - //----- Tracking allocator ---------------------------------- + //----- General setup ---------------------------------- { - tracking_temp_allocator := false // Temp track_temp: mem.Tracking_Allocator - if tracking_temp_allocator { - mem.tracking_allocator_init(&track_temp, context.temp_allocator) - context.temp_allocator = mem.tracking_allocator(&track_temp) - } + mem.tracking_allocator_init(&track_temp, context.temp_allocator) + context.temp_allocator = mem.tracking_allocator(&track_temp) + // Default track: mem.Tracking_Allocator mem.tracking_allocator_init(&track, context.allocator) @@ -22,18 +21,10 @@ main :: proc() { // This could be fine for some global state or it could be a memory leak. defer { // Temp allocator - if tracking_temp_allocator { - if len(track_temp.allocation_map) > 0 { - fmt.eprintf("=== %v allocations not freed - temp allocator: ===\n", len(track_temp.allocation_map)) - for _, entry in track_temp.allocation_map { - fmt.eprintf("- %v bytes @ %v\n", entry.size, entry.location) - } - } - if len(track_temp.bad_free_array) > 0 { - fmt.eprintf("=== %v incorrect frees - temp allocator: ===\n", len(track_temp.bad_free_array)) - for entry in track_temp.bad_free_array { - fmt.eprintf("- %p @ %v\n", entry.memory, entry.location) - } + if len(track_temp.bad_free_array) > 0 { + fmt.eprintf("=== %v incorrect frees - temp allocator: ===\n", len(track_temp.bad_free_array)) + for entry in track_temp.bad_free_array { + fmt.eprintf("- %p @ %v\n", entry.memory, entry.location) } mem.tracking_allocator_destroy(&track_temp) } @@ -52,6 +43,9 @@ main :: proc() { } mem.tracking_allocator_destroy(&track) } + // Logger + context.logger = log.create_console_logger() + defer log.destroy_console_logger(context.logger) } args := os.args diff --git a/meta/main.odin b/meta/main.odin index e154245..6e6275b 100644 --- a/meta/main.odin +++ b/meta/main.odin @@ -1,6 +1,8 @@ package meta import "core:fmt" +import "core:log" +import "core:mem" import "core:os" Command :: struct { @@ -20,6 +22,48 @@ COMMANDS :: []Command { } main :: proc() { + //----- General setup ---------------------------------- + when ODIN_DEBUG { + // Temp + track_temp: mem.Tracking_Allocator + mem.tracking_allocator_init(&track_temp, context.temp_allocator) + context.temp_allocator = mem.tracking_allocator(&track_temp) + + // Default + track: mem.Tracking_Allocator + mem.tracking_allocator_init(&track, context.allocator) + context.allocator = mem.tracking_allocator(&track) + // Log a warning about any memory that was not freed by the end of the program. + // This could be fine for some global state or it could be a memory leak. + defer { + // Temp allocator + if len(track_temp.bad_free_array) > 0 { + fmt.eprintf("=== %v incorrect frees - temp allocator: ===\n", len(track_temp.bad_free_array)) + for entry in track_temp.bad_free_array { + fmt.eprintf("- %p @ %v\n", entry.memory, entry.location) + } + mem.tracking_allocator_destroy(&track_temp) + } + // Default allocator + if len(track.allocation_map) > 0 { + fmt.eprintf("=== %v allocations not freed - main allocator: ===\n", len(track.allocation_map)) + for _, entry in track.allocation_map { + fmt.eprintf("- %v bytes @ %v\n", entry.size, entry.location) + } + } + if len(track.bad_free_array) > 0 { + fmt.eprintf("=== %v incorrect frees - main allocator: ===\n", len(track.bad_free_array)) + for entry in track.bad_free_array { + fmt.eprintf("- %p @ %v\n", entry.memory, entry.location) + } + } + mem.tracking_allocator_destroy(&track) + } + // Logger + context.logger = log.create_console_logger() + defer log.destroy_console_logger(context.logger) + } + args := os.args[1:] if len(args) == 0 { diff --git a/qrcode/examples/examples.odin b/qrcode/examples/examples.odin index fabca9a..a3d4be1 100644 --- a/qrcode/examples/examples.odin +++ b/qrcode/examples/examples.odin @@ -1,39 +1,32 @@ package examples import "core:fmt" +import "core:log" import "core:mem" import "core:os" import qr ".." main :: proc() { - //----- Tracking allocator ---------------------------------- + //----- General setup ---------------------------------- { - tracking_temp_allocator := false // Temp track_temp: mem.Tracking_Allocator - if tracking_temp_allocator { - mem.tracking_allocator_init(&track_temp, context.temp_allocator) - context.temp_allocator = mem.tracking_allocator(&track_temp) - } + mem.tracking_allocator_init(&track_temp, context.temp_allocator) + context.temp_allocator = mem.tracking_allocator(&track_temp) + // Default track: mem.Tracking_Allocator mem.tracking_allocator_init(&track, context.allocator) context.allocator = mem.tracking_allocator(&track) + // Log a warning about any memory that was not freed by the end of the program. + // This could be fine for some global state or it could be a memory leak. defer { // Temp allocator - if tracking_temp_allocator { - if len(track_temp.allocation_map) > 0 { - fmt.eprintf("=== %v allocations not freed - temp allocator: ===\n", len(track_temp.allocation_map)) - for _, entry in track_temp.allocation_map { - fmt.eprintf("- %v bytes @ %v\n", entry.size, entry.location) - } - } - if len(track_temp.bad_free_array) > 0 { - fmt.eprintf("=== %v incorrect frees - temp allocator: ===\n", len(track_temp.bad_free_array)) - for entry in track_temp.bad_free_array { - fmt.eprintf("- %p @ %v\n", entry.memory, entry.location) - } + if len(track_temp.bad_free_array) > 0 { + fmt.eprintf("=== %v incorrect frees - temp allocator: ===\n", len(track_temp.bad_free_array)) + for entry in track_temp.bad_free_array { + fmt.eprintf("- %p @ %v\n", entry.memory, entry.location) } mem.tracking_allocator_destroy(&track_temp) } @@ -52,6 +45,9 @@ main :: proc() { } mem.tracking_allocator_destroy(&track) } + // Logger + context.logger = log.create_console_logger() + defer log.destroy_console_logger(context.logger) } args := os.args diff --git a/vendor/lmdb/examples/examples.odin b/vendor/lmdb/examples/examples.odin index 1df4e87..4a2a805 100644 --- a/vendor/lmdb/examples/examples.odin +++ b/vendor/lmdb/examples/examples.odin @@ -1,8 +1,11 @@ package examples import "core:fmt" +import "core:log" +import "core:mem" import "core:os" import "core:sys/posix" + import mdb "../../lmdb" // 0o660 @@ -10,33 +13,75 @@ DB_MODE :: posix.mode_t{.IWGRP, .IRGRP, .IWUSR, .IRUSR} DB_PATH :: "out/debug/lmdb_example_db" main :: proc() { - environment: ^mdb.Env + //----- General setup ---------------------------------- + { + // Temp + track_temp: mem.Tracking_Allocator + mem.tracking_allocator_init(&track_temp, context.temp_allocator) + context.temp_allocator = mem.tracking_allocator(&track_temp) - // Create environment for lmdb - mdb.panic_on_err(mdb.env_create(&environment)) - // Create directory for databases. Won't do anything if it already exists. - os.make_directory(DB_PATH) - // Open the database files (creates them if they don't already exist) - mdb.panic_on_err(mdb.env_open(environment, DB_PATH, {}, DB_MODE)) + // Default + track: mem.Tracking_Allocator + mem.tracking_allocator_init(&track, context.allocator) + context.allocator = mem.tracking_allocator(&track) + // Log a warning about any memory that was not freed by the end of the program. + // This could be fine for some global state or it could be a memory leak. + defer { + // Temp allocator + if len(track_temp.bad_free_array) > 0 { + fmt.eprintf("=== %v incorrect frees - temp allocator: ===\n", len(track_temp.bad_free_array)) + for entry in track_temp.bad_free_array { + fmt.eprintf("- %p @ %v\n", entry.memory, entry.location) + } + mem.tracking_allocator_destroy(&track_temp) + } + // Default allocator + if len(track.allocation_map) > 0 { + fmt.eprintf("=== %v allocations not freed - main allocator: ===\n", len(track.allocation_map)) + for _, entry in track.allocation_map { + fmt.eprintf("- %v bytes @ %v\n", entry.size, entry.location) + } + } + if len(track.bad_free_array) > 0 { + fmt.eprintf("=== %v incorrect frees - main allocator: ===\n", len(track.bad_free_array)) + for entry in track.bad_free_array { + fmt.eprintf("- %p @ %v\n", entry.memory, entry.location) + } + } + mem.tracking_allocator_destroy(&track) + } + // Logger + context.logger = log.create_console_logger() + defer log.destroy_console_logger(context.logger) + } - // Transactions - txn_handle: ^mdb.Txn - db_handle: mdb.Dbi - // Put transaction - key := 7 - key_val := mdb.blittable_val(&key) - put_data := 12 - put_data_val := mdb.blittable_val(&put_data) - mdb.panic_on_err(mdb.txn_begin(environment, nil, {}, &txn_handle)) - mdb.panic_on_err(mdb.dbi_open(txn_handle, nil, {}, &db_handle)) - mdb.panic_on_err(mdb.put(txn_handle, db_handle, &key_val, &put_data_val, {})) - mdb.panic_on_err(mdb.txn_commit(txn_handle)) + environment: ^mdb.Env - // Get transaction - data_val: mdb.Val - mdb.panic_on_err(mdb.txn_begin(environment, nil, {}, &txn_handle)) - mdb.panic_on_err(mdb.get(txn_handle, db_handle, &key_val, &data_val)) - data_cpy := mdb.blittable_copy(&data_val, int) - mdb.panic_on_err(mdb.txn_commit(txn_handle)) - fmt.println("Get result:", data_cpy) + // Create environment for lmdb + mdb.panic_on_err(mdb.env_create(&environment)) + // Create directory for databases. Won't do anything if it already exists. + os.make_directory(DB_PATH) + // Open the database files (creates them if they don't already exist) + mdb.panic_on_err(mdb.env_open(environment, DB_PATH, {}, DB_MODE)) + + // Transactions + txn_handle: ^mdb.Txn + db_handle: mdb.Dbi + // Put transaction + key := 7 + key_val := mdb.blittable_val(&key) + put_data := 12 + put_data_val := mdb.blittable_val(&put_data) + mdb.panic_on_err(mdb.txn_begin(environment, nil, {}, &txn_handle)) + mdb.panic_on_err(mdb.dbi_open(txn_handle, nil, {}, &db_handle)) + mdb.panic_on_err(mdb.put(txn_handle, db_handle, &key_val, &put_data_val, {})) + mdb.panic_on_err(mdb.txn_commit(txn_handle)) + + // Get transaction + data_val: mdb.Val + mdb.panic_on_err(mdb.txn_begin(environment, nil, {}, &txn_handle)) + mdb.panic_on_err(mdb.get(txn_handle, db_handle, &key_val, &data_val)) + data_cpy := mdb.blittable_copy(&data_val, int) + mdb.panic_on_err(mdb.txn_commit(txn_handle)) + fmt.println("Get result:", data_cpy) }