aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuka Aleksić <laleksic@mail.ru>2021-01-21 00:19:56 +0100
committerLuka Aleksić <laleksic@mail.ru>2021-01-21 00:19:56 +0100
commit00ebc877a17bebd2215fcdbf2b9a5dc9aeed4ee5 (patch)
tree1c84642eaa46b3415425734ccc59b8cf36e666b0
parent53d8ec4d15d63977bb3c1f799dabd3c5b87558dd (diff)
Tracking allocator now tracks bad free calls
-rw-r--r--core/mem/allocators.odin21
1 files changed, 18 insertions, 3 deletions
diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin
index 6ac986c86..620a6e714 100644
--- a/core/mem/allocators.odin
+++ b/core/mem/allocators.odin
@@ -836,19 +836,26 @@ Tracking_Allocator_Entry :: struct {
alignment: int,
location: runtime.Source_Code_Location,
}
+Tracking_Allocator_Bad_Free_Entry :: struct {
+ memory: rawptr,
+ location: runtime.Source_Code_Location,
+}
Tracking_Allocator :: struct {
backing: Allocator,
allocation_map: map[rawptr]Tracking_Allocator_Entry,
+ bad_free_array: [dynamic]Tracking_Allocator_Bad_Free_Entry,
clear_on_free_all: bool,
}
-tracking_allocator_init :: proc(t: ^Tracking_Allocator, backing_allocator: Allocator, allocation_map_allocator := context.allocator) {
+tracking_allocator_init :: proc(t: ^Tracking_Allocator, backing_allocator: Allocator, internals_allocator := context.allocator) {
t.backing = backing_allocator;
- t.allocation_map.allocator = allocation_map_allocator;
+ t.allocation_map.allocator = internals_allocator;
+ t.bad_free_array.allocator = internals_allocator;
}
tracking_allocator_destroy :: proc(t: ^Tracking_Allocator) {
delete(t.allocation_map);
+ delete(t.bad_free_array);
}
tracking_allocator :: proc(data: ^Tracking_Allocator) -> Allocator {
@@ -874,7 +881,15 @@ tracking_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, si
return nil;
}
- result := data.backing.procedure(data.backing.data, mode, size, alignment, old_memory, old_size, flags, loc);
+ result: rawptr;
+ if mode == .Free && old_memory not_in data.allocation_map {
+ append(&data.bad_free_array, Tracking_Allocator_Bad_Free_Entry{
+ memory = old_memory,
+ location = loc,
+ });
+ } else {
+ result = data.backing.procedure(data.backing.data, mode, size, alignment, old_memory, old_size, flags, loc);
+ }
if data.allocation_map.allocator.procedure == nil {
data.allocation_map.allocator = context.allocator;