diff --git a/core/mem/mutex_allocator.odin b/core/mem/mutex_allocator.odin new file mode 100644 index 000000000..dd27a4518 --- /dev/null +++ b/core/mem/mutex_allocator.odin @@ -0,0 +1,33 @@ +//+build !freestanding +package mem + +import "core:sync" + +Mutex_allocator :: struct { + backing: Allocator, + mutex: sync.Mutex, +} + +mutex_allocator_init :: proc(m: ^Mutex_allocator, backing_allocator: Allocator) { + m.backing = backing_allocator + m.mutex = {} +} + + +@(require_results) +mutex_allocator :: proc(m: ^Mutex_allocator) -> Allocator { + return Allocator{ + procedure = mutex_allocator_proc, + data = m, + } +} + +mutex_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) { + m := (^Mutex_allocator)(allocator_data) + + sync.mutex_guard(&m.mutex) + return m.backing.procedure(allocator_data, mode, size, alignment, old_memory, old_size, loc) +} +