Add basic "lock" around Log_Allocator to minimize errors with allocation logging loops

This commit is contained in:
gingerBill
2022-08-08 15:25:11 +01:00
parent 659c3c528d
commit 838554460b
+7
View File
@@ -6,12 +6,14 @@ Log_Allocator :: struct {
allocator: runtime.Allocator, allocator: runtime.Allocator,
level: Level, level: Level,
prefix: string, prefix: string,
locked: bool,
} }
log_allocator_init :: proc(la: ^Log_Allocator, level: Level, allocator := context.allocator, prefix := "") { log_allocator_init :: proc(la: ^Log_Allocator, level: Level, allocator := context.allocator, prefix := "") {
la.allocator = allocator la.allocator = allocator
la.level = level la.level = level
la.prefix = prefix la.prefix = prefix
la.locked = false
} }
@@ -27,6 +29,10 @@ log_allocator_proc :: proc(allocator_data: rawptr, mode: runtime.Allocator_Mode,
old_memory: rawptr, old_size: int, location := #caller_location) -> ([]byte, runtime.Allocator_Error) { old_memory: rawptr, old_size: int, location := #caller_location) -> ([]byte, runtime.Allocator_Error) {
la := (^Log_Allocator)(allocator_data) la := (^Log_Allocator)(allocator_data)
if !la.locked {
la.locked = true
defer la.locked = false
switch mode { switch mode {
case .Alloc: case .Alloc:
logf( logf(
@@ -80,6 +86,7 @@ log_allocator_proc :: proc(allocator_data: rawptr, mode: runtime.Allocator_Mode,
location = location, location = location,
) )
} }
}
return la.allocator.procedure(la.allocator.data, mode, size, alignment, old_memory, old_size, location) return la.allocator.procedure(la.allocator.data, mode, size, alignment, old_memory, old_size, location)
} }