#include #include #include "malunal/allocator.h" const uuid_t UUID_ALLOCATOR_T = { .tl = 0xEB14C3C3, .tm = 0x5F0E, .thv = 0x48A4, .csr = 0x8C, .csl = 0xFD, .nbs = { 0x58, 0x04, 0x13, 0x19, 0xF9, 0xB2 } }; static malunal_cstr_t describe(malunal_int32_t code) { switch (code) { case ALLOCATOR_ERROR_FAILURE: return "Generic allocator error"; case ALLOCATOR_ERROR_NULL_ALLOCATOR: return "Allocator provided was null"; case ALLOCATOR_ERROR_OUT_OF_MEMORY: return "Allocator out of memory"; case ALLOCATOR_ERROR_NOT_MY_ADDRESS: return "Address does not belong to allocator"; case ALLOCATOR_ERROR_LEAKY_MEMORY: return "Allocator is leaking memory"; } return "Unknown allocator error"; } const error_domain_t ERROR_DOMAIN_ALLOCATOR_T = { .describe = &describe, .name = "malunal.allocator.error" }; error_t allocator_acquire( allocator_mptr_t allocator, malunal_size_t size, malunal_mptr_t* out ) { return allocator != null ? allocator->vtable->acquire(allocator, size, out) : (error_t) { .domain = &ERROR_DOMAIN_ALLOCATOR_T, .code = ALLOCATOR_ERROR_NULL_ALLOCATOR }; } error_t allocator_dispose( allocator_mptr_t allocator, malunal_mptr_t address, malunal_size_t size ) { return allocator != null ? allocator->vtable->dispose(allocator, address, size) : (error_t) { .domain = &ERROR_DOMAIN_ALLOCATOR_T, .code = ALLOCATOR_ERROR_NULL_ALLOCATOR }; } malunal_size_t align_to( malunal_size_t size, malunal_size_t alignment ) { return (size + alignment - 1) & ~(alignment - 1); } malunal_size_t align_to_page(malunal_size_t size) { return align_to(size, platform_page_size()); } allocator_mptr_t platform_allocator() { #if MALUNAL_PLATFORM_LINUX return linux_allocator(); #elif MALUNAL_PLATFORM_WIN32 return win32_allocator(); #endif /* Platform specific allocators */ }