#include "base_core.h" #include "platform.h" #include #include #include #include #define IsPageAligned(x) (IsAlignedTo(x, platform_page_size())) U32 platform_page_size(void) { return sysconf(_SC_PAGESIZE); } void *platform_malloc(size_t size) { return malloc(size); } void platform_free(void *mem) { free(mem); } void *memory_allocate_and_commit(size_t size) { Assert(IsPageAligned(size)); void *mem = mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); TRACEF("memory_allocate size=%7zu mem=%p\n", size, mem); if (mem == MAP_FAILED) { mem = NULL; } else { int rc = madvise(mem, size, MADV_POPULATE_WRITE); if (rc != 0) { munmap(mem, size); mem = NULL; } } return mem; } void memory_free(void *mem, size_t size) { TRACEF(" memory_free size=%7zu mem=%p\n", size, mem); Assert(IsPageAligned((uintptr_t)mem)); Assert(IsPageAligned(size)); int rc = munmap(mem, size); Assert(rc == 0); } void *memory_reserve(size_t size) { Assert(IsPageAligned(size)); void *mem = mmap(0, size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); TRACEF("memory_reserve size=%7zu mem=%p\n", size, mem); if (mem == MAP_FAILED) { mem = NULL; } return mem; } void memory_commit(void *mem, size_t size) { Assert(IsPageAligned((uintptr_t)mem)); Assert(IsPageAligned(size)); TRACEF("memory_commit size=%7zu mem=%p\n", size, mem); int rc; rc = mprotect(mem, size, PROT_READ | PROT_WRITE); Assert(rc == 0); rc = madvise(mem, size, MADV_WILLNEED); Assert(rc == 0); } void memory_decommit(void *mem, size_t size) { TRACEF("memory_decommit size=%7zu mem=%p\n", size, mem); Assert(IsPageAligned((uintptr_t)mem)); Assert(IsPageAligned(size)); int rc; rc = mprotect(mem, size, PROT_NONE); Assert(rc == 0); rc = madvise(mem, size, MADV_DONTNEED); Assert(rc == 0); }