12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- #+build !freestanding
- package mem
- import "core:sync"
- /*
- The data for mutex allocator.
- */
- Mutex_Allocator :: struct {
- backing: Allocator,
- mutex: sync.Mutex,
- }
- /*
- Initialize the mutex allocator.
- This procedure initializes the mutex allocator using `backin_allocator` as the
- allocator that will be used to pass all allocation requests through.
- */
- mutex_allocator_init :: proc(m: ^Mutex_Allocator, backing_allocator: Allocator) {
- m.backing = backing_allocator
- m.mutex = {}
- }
- /*
- Mutex allocator.
- The mutex allocator is a wrapper for allocators that is used to serialize all
- allocator requests across multiple threads.
- */
- @(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: int,
- 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(m.backing.data, mode, size, alignment, old_memory, old_size, loc)
- }
|