From 9045c9ed0c91563bf1dc806e3da8ed0d123f4c12 Mon Sep 17 00:00:00 2001 From: olesya-wo <29059032+olesya-wo@users.noreply.github.com> Date: Tue, 12 Mar 2024 13:53:31 +0300 Subject: [PATCH 1/3] Improved statistics for core/mem/Tracking_Allocator --- core/mem/tracking_allocator.odin | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/core/mem/tracking_allocator.odin b/core/mem/tracking_allocator.odin index d6d189731..bdf6aa5e2 100644 --- a/core/mem/tracking_allocator.odin +++ b/core/mem/tracking_allocator.odin @@ -22,6 +22,12 @@ Tracking_Allocator :: struct { bad_free_array: [dynamic]Tracking_Allocator_Bad_Free_Entry, mutex: sync.Mutex, clear_on_free_all: bool, + allocated: int, + alloc_count: int, + freed: int, + free_count: int, + peak: int, + current: int, } tracking_allocator_init :: proc(t: ^Tracking_Allocator, backing_allocator: Allocator, internals_allocator := context.allocator) { @@ -44,6 +50,7 @@ tracking_allocator_clear :: proc(t: ^Tracking_Allocator) { sync.mutex_lock(&t.mutex) clear(&t.allocation_map) clear(&t.bad_free_array) + t.current = 0 sync.mutex_unlock(&t.mutex) } @@ -56,6 +63,19 @@ tracking_allocator :: proc(data: ^Tracking_Allocator) -> Allocator { } } +track_alloc :: proc(data: ^Tracking_Allocator, entry: ^Tracking_Allocator_Entry) { + data.allocated += entry.size + data.alloc_count += 1 + data.current += entry.size + if data.current > data.peak do data.peak = data.current +} + +track_free :: proc(data: ^Tracking_Allocator, entry: ^Tracking_Allocator_Entry) { + data.freed += entry.size + data.free_count += 1 + data.current -= entry.size +} + tracking_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, size, alignment: int, old_memory: rawptr, old_size: int, loc := #caller_location) -> (result: []byte, err: Allocator_Error) { @@ -100,13 +120,21 @@ tracking_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, err = err, location = loc, } + track_alloc(data, &data.allocation_map[result_ptr]) case .Free: + if old_memory != nil && old_memory in data.allocation_map { + track_free(data, &data.allocation_map[old_memory]) + } delete_key(&data.allocation_map, old_memory) case .Free_All: if data.clear_on_free_all { clear_map(&data.allocation_map) + data.current = 0 } case .Resize, .Resize_Non_Zeroed: + if old_memory != nil && old_memory in data.allocation_map { + track_free(data, &data.allocation_map[old_memory]) + } if old_memory != result_ptr { delete_key(&data.allocation_map, old_memory) } @@ -118,6 +146,7 @@ tracking_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, err = err, location = loc, } + track_alloc(data, &data.allocation_map[result_ptr]) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) From d979129a50ae4b22ffb1196686d2cef760ce5141 Mon Sep 17 00:00:00 2001 From: olesya-wo <29059032+olesya-wo@users.noreply.github.com> Date: Tue, 12 Mar 2024 16:32:17 +0300 Subject: [PATCH 2/3] Naming and type changes --- core/mem/tracking_allocator.odin | 45 +++++++++++++++++--------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/core/mem/tracking_allocator.odin b/core/mem/tracking_allocator.odin index bdf6aa5e2..9ed49a41b 100644 --- a/core/mem/tracking_allocator.odin +++ b/core/mem/tracking_allocator.odin @@ -22,12 +22,13 @@ Tracking_Allocator :: struct { bad_free_array: [dynamic]Tracking_Allocator_Bad_Free_Entry, mutex: sync.Mutex, clear_on_free_all: bool, - allocated: int, - alloc_count: int, - freed: int, - free_count: int, - peak: int, - current: int, + + total_memory_allocated: i64, + total_allocation_count: i64, + total_memory_freed: i64, + total_free_count: i64, + peak_memory_allocated: i64, + current_memory_allocated: i64, } tracking_allocator_init :: proc(t: ^Tracking_Allocator, backing_allocator: Allocator, internals_allocator := context.allocator) { @@ -50,7 +51,7 @@ tracking_allocator_clear :: proc(t: ^Tracking_Allocator) { sync.mutex_lock(&t.mutex) clear(&t.allocation_map) clear(&t.bad_free_array) - t.current = 0 + t.current_memory_allocated = 0 sync.mutex_unlock(&t.mutex) } @@ -63,22 +64,24 @@ tracking_allocator :: proc(data: ^Tracking_Allocator) -> Allocator { } } -track_alloc :: proc(data: ^Tracking_Allocator, entry: ^Tracking_Allocator_Entry) { - data.allocated += entry.size - data.alloc_count += 1 - data.current += entry.size - if data.current > data.peak do data.peak = data.current -} - -track_free :: proc(data: ^Tracking_Allocator, entry: ^Tracking_Allocator_Entry) { - data.freed += entry.size - data.free_count += 1 - data.current -= entry.size -} - tracking_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, size, alignment: int, old_memory: rawptr, old_size: int, loc := #caller_location) -> (result: []byte, err: Allocator_Error) { + track_alloc :: proc(data: ^Tracking_Allocator, entry: ^Tracking_Allocator_Entry) { + data.total_memory_allocated += entry.size + data.total_allocation_count += 1 + data.current_memory_allocated += entry.size + if data.current_memory_allocated > data.peak_memory_allocated { + data.peak_memory_allocated = data.current_memory_allocated + } + } + + track_free :: proc(data: ^Tracking_Allocator, entry: ^Tracking_Allocator_Entry) { + data.total_memory_freed += entry.size + data.total_free_count += 1 + data.current_memory_allocated -= entry.size + } + data := (^Tracking_Allocator)(allocator_data) sync.mutex_guard(&data.mutex) @@ -129,7 +132,7 @@ tracking_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, case .Free_All: if data.clear_on_free_all { clear_map(&data.allocation_map) - data.current = 0 + data.current_memory_allocated = 0 } case .Resize, .Resize_Non_Zeroed: if old_memory != nil && old_memory in data.allocation_map { From 51a4d97f03980838139b4883b1d62debe55105e8 Mon Sep 17 00:00:00 2001 From: olesya-wo <29059032+olesya-wo@users.noreply.github.com> Date: Tue, 12 Mar 2024 18:25:54 +0300 Subject: [PATCH 3/3] type conversion fix --- core/mem/tracking_allocator.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/mem/tracking_allocator.odin b/core/mem/tracking_allocator.odin index 9ed49a41b..bc624617d 100644 --- a/core/mem/tracking_allocator.odin +++ b/core/mem/tracking_allocator.odin @@ -68,18 +68,18 @@ tracking_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, size, alignment: int, old_memory: rawptr, old_size: int, loc := #caller_location) -> (result: []byte, err: Allocator_Error) { track_alloc :: proc(data: ^Tracking_Allocator, entry: ^Tracking_Allocator_Entry) { - data.total_memory_allocated += entry.size + data.total_memory_allocated += i64(entry.size) data.total_allocation_count += 1 - data.current_memory_allocated += entry.size + data.current_memory_allocated += i64(entry.size) if data.current_memory_allocated > data.peak_memory_allocated { data.peak_memory_allocated = data.current_memory_allocated } } track_free :: proc(data: ^Tracking_Allocator, entry: ^Tracking_Allocator_Entry) { - data.total_memory_freed += entry.size + data.total_memory_freed += i64(entry.size) data.total_free_count += 1 - data.current_memory_allocated -= entry.size + data.current_memory_allocated -= i64(entry.size) } data := (^Tracking_Allocator)(allocator_data)