mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Use sync.Mutex instead of a boolean-check for log.Log_Allocator
This commit is contained in:
+70
-71
@@ -2,26 +2,30 @@ package log
|
|||||||
|
|
||||||
import "base:runtime"
|
import "base:runtime"
|
||||||
import "core:fmt"
|
import "core:fmt"
|
||||||
|
import "core:sync"
|
||||||
|
|
||||||
Log_Allocator_Format :: enum {
|
Log_Allocator_Format :: enum {
|
||||||
Bytes, // Actual number of bytes.
|
Bytes, // Actual number of bytes.
|
||||||
Human, // Bytes in human units like bytes, kibibytes, etc. as appropriate.
|
Human, // Bytes in human units like bytes, kibibytes, etc. as appropriate.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Log_Allocator is an allocator which calls `context.logger` on each of its allocations operations.
|
||||||
|
// The format can be changed by setting the `size_fmt: Log_Allocator_Format` field to either `Bytes` or `Human`.
|
||||||
Log_Allocator :: struct {
|
Log_Allocator :: struct {
|
||||||
allocator: runtime.Allocator,
|
allocator: runtime.Allocator,
|
||||||
level: Level,
|
level: Level,
|
||||||
prefix: string,
|
prefix: string,
|
||||||
locked: bool,
|
lock: sync.Mutex,
|
||||||
size_fmt: Log_Allocator_Format,
|
size_fmt: Log_Allocator_Format,
|
||||||
}
|
}
|
||||||
|
|
||||||
log_allocator_init :: proc(la: ^Log_Allocator, level: Level, size_fmt := Log_Allocator_Format.Bytes,
|
log_allocator_init :: proc(la: ^Log_Allocator, level: Level, size_fmt := Log_Allocator_Format.Bytes,
|
||||||
allocator := context.allocator, prefix := "") {
|
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
|
la.lock = {}
|
||||||
la.size_fmt = size_fmt
|
la.size_fmt = size_fmt
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,83 +50,78 @@ log_allocator_proc :: proc(allocator_data: rawptr, mode: runtime.Allocator_Mode,
|
|||||||
|
|
||||||
buf: [256]byte = ---
|
buf: [256]byte = ---
|
||||||
|
|
||||||
if !la.locked {
|
sync.lock(&la.lock)
|
||||||
la.locked = true
|
switch mode {
|
||||||
defer la.locked = false
|
case .Alloc:
|
||||||
|
format: string
|
||||||
|
switch la.size_fmt {
|
||||||
|
case .Bytes: format = "%s%s>>> ALLOCATOR(mode=.Alloc, size=%d, alignment=%d)"
|
||||||
|
case .Human: format = "%s%s>>> ALLOCATOR(mode=.Alloc, size=%m, alignment=%d)"
|
||||||
|
}
|
||||||
|
str := fmt.bprintf(buf[:], format, la.prefix, padding, size, alignment)
|
||||||
|
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
||||||
|
|
||||||
switch mode {
|
case .Alloc_Non_Zeroed:
|
||||||
case .Alloc:
|
format: string
|
||||||
|
switch la.size_fmt {
|
||||||
|
case .Bytes: format = "%s%s>>> ALLOCATOR(mode=.Alloc_Non_Zeroed, size=%d, alignment=%d)"
|
||||||
|
case .Human: format = "%s%s>>> ALLOCATOR(mode=.Alloc_Non_Zeroed, size=%m, alignment=%d)"
|
||||||
|
}
|
||||||
|
str := fmt.bprintf(buf[:], format, la.prefix, padding, size, alignment)
|
||||||
|
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
||||||
|
|
||||||
|
case .Free:
|
||||||
|
if old_size != 0 {
|
||||||
format: string
|
format: string
|
||||||
switch la.size_fmt {
|
switch la.size_fmt {
|
||||||
case .Bytes: format = "%s%s>>> ALLOCATOR(mode=.Alloc, size=%d, alignment=%d)"
|
case .Bytes: format = "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p, size=%d)"
|
||||||
case .Human: format = "%s%s>>> ALLOCATOR(mode=.Alloc, size=%m, alignment=%d)"
|
case .Human: format = "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p, size=%m)"
|
||||||
}
|
}
|
||||||
str := fmt.bprintf(buf[:], format, la.prefix, padding, size, alignment)
|
str := fmt.bprintf(buf[:], format, la.prefix, padding, old_memory, old_size)
|
||||||
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
||||||
|
} else {
|
||||||
case .Alloc_Non_Zeroed:
|
str := fmt.bprintf(buf[:], "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p)", la.prefix, padding, old_memory)
|
||||||
format: string
|
|
||||||
switch la.size_fmt {
|
|
||||||
case .Bytes: format = "%s%s>>> ALLOCATOR(mode=.Alloc_Non_Zeroed, size=%d, alignment=%d)"
|
|
||||||
case .Human: format = "%s%s>>> ALLOCATOR(mode=.Alloc_Non_Zeroed, size=%m, alignment=%d)"
|
|
||||||
}
|
|
||||||
str := fmt.bprintf(buf[:], format, la.prefix, padding, size, alignment)
|
|
||||||
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
|
||||||
|
|
||||||
case .Free:
|
|
||||||
if old_size != 0 {
|
|
||||||
format: string
|
|
||||||
switch la.size_fmt {
|
|
||||||
case .Bytes: format = "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p, size=%d)"
|
|
||||||
case .Human: format = "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p, size=%m)"
|
|
||||||
}
|
|
||||||
str := fmt.bprintf(buf[:], format, la.prefix, padding, old_memory, old_size)
|
|
||||||
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
|
||||||
} else {
|
|
||||||
str := fmt.bprintf(buf[:], "%s%s<<< ALLOCATOR(mode=.Free, ptr=%p)", la.prefix, padding, old_memory)
|
|
||||||
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
|
||||||
}
|
|
||||||
|
|
||||||
case .Free_All:
|
|
||||||
str := fmt.bprintf(buf[:], "%s%s<<< ALLOCATOR(mode=.Free_All)", la.prefix, padding)
|
|
||||||
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
|
||||||
|
|
||||||
case .Resize:
|
|
||||||
format: string
|
|
||||||
switch la.size_fmt {
|
|
||||||
case .Bytes: format = "%s%s>>> ALLOCATOR(mode=.Resize, ptr=%p, old_size=%d, size=%d, alignment=%d)"
|
|
||||||
case .Human: format = "%s%s>>> ALLOCATOR(mode=.Resize, ptr=%p, old_size=%m, size=%m, alignment=%d)"
|
|
||||||
}
|
|
||||||
str := fmt.bprintf(buf[:], format, la.prefix, padding, old_memory, old_size, size, alignment)
|
|
||||||
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
|
||||||
|
|
||||||
case .Resize_Non_Zeroed:
|
|
||||||
format: string
|
|
||||||
switch la.size_fmt {
|
|
||||||
case .Bytes: format = "%s%s>>> ALLOCATOR(mode=.Resize_Non_Zeroed, ptr=%p, old_size=%d, size=%d, alignment=%d)"
|
|
||||||
case .Human: format = "%s%s>>> ALLOCATOR(mode=.Resize_Non_Zeroed, ptr=%p, old_size=%m, size=%m, alignment=%d)"
|
|
||||||
}
|
|
||||||
str := fmt.bprintf(buf[:], format, la.prefix, padding, old_memory, old_size, size, alignment)
|
|
||||||
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
|
||||||
|
|
||||||
case .Query_Features:
|
|
||||||
str := fmt.bprintf(buf[:], "%s%sALLOCATOR(mode=.Query_Features)", la.prefix, padding)
|
|
||||||
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
|
||||||
|
|
||||||
case .Query_Info:
|
|
||||||
str := fmt.bprintf(buf[:], "%s%sALLOCATOR(mode=.Query_Info)", la.prefix, padding)
|
|
||||||
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case .Free_All:
|
||||||
|
str := fmt.bprintf(buf[:], "%s%s<<< ALLOCATOR(mode=.Free_All)", la.prefix, padding)
|
||||||
|
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
||||||
|
|
||||||
|
case .Resize:
|
||||||
|
format: string
|
||||||
|
switch la.size_fmt {
|
||||||
|
case .Bytes: format = "%s%s>>> ALLOCATOR(mode=.Resize, ptr=%p, old_size=%d, size=%d, alignment=%d)"
|
||||||
|
case .Human: format = "%s%s>>> ALLOCATOR(mode=.Resize, ptr=%p, old_size=%m, size=%m, alignment=%d)"
|
||||||
|
}
|
||||||
|
str := fmt.bprintf(buf[:], format, la.prefix, padding, old_memory, old_size, size, alignment)
|
||||||
|
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
||||||
|
|
||||||
|
case .Resize_Non_Zeroed:
|
||||||
|
format: string
|
||||||
|
switch la.size_fmt {
|
||||||
|
case .Bytes: format = "%s%s>>> ALLOCATOR(mode=.Resize_Non_Zeroed, ptr=%p, old_size=%d, size=%d, alignment=%d)"
|
||||||
|
case .Human: format = "%s%s>>> ALLOCATOR(mode=.Resize_Non_Zeroed, ptr=%p, old_size=%m, size=%m, alignment=%d)"
|
||||||
|
}
|
||||||
|
str := fmt.bprintf(buf[:], format, la.prefix, padding, old_memory, old_size, size, alignment)
|
||||||
|
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
||||||
|
|
||||||
|
case .Query_Features:
|
||||||
|
str := fmt.bprintf(buf[:], "%s%sALLOCATOR(mode=.Query_Features)", la.prefix, padding)
|
||||||
|
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
||||||
|
|
||||||
|
case .Query_Info:
|
||||||
|
str := fmt.bprintf(buf[:], "%s%sALLOCATOR(mode=.Query_Info)", la.prefix, padding)
|
||||||
|
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
||||||
}
|
}
|
||||||
|
sync.unlock(&la.lock)
|
||||||
|
|
||||||
data, err := la.allocator.procedure(la.allocator.data, mode, size, alignment, old_memory, old_size, location)
|
data, err := la.allocator.procedure(la.allocator.data, mode, size, alignment, old_memory, old_size, location)
|
||||||
if !la.locked {
|
if err != nil {
|
||||||
la.locked = true
|
sync.lock(&la.lock)
|
||||||
defer la.locked = false
|
str := fmt.bprintf(buf[:], "%s%sALLOCATOR ERROR=%v", la.prefix, padding, err)
|
||||||
if err != nil {
|
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
||||||
str := fmt.bprintf(buf[:], "%s%sALLOCATOR ERROR=%v", la.prefix, padding, err)
|
sync.unlock(&la.lock)
|
||||||
context.logger.procedure(context.logger.data, la.level, str, context.logger.options, location)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return data, err
|
return data, err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user