UniqueRange AllocateVM(size_t size, vm::PageType pageType, int prot) { const UniqueRange::pointer p = vm::Allocate(size, pageType, prot); static volatile IdxDeleter idxDeleter; if(idxDeleter == 0) // (optional optimization) RegisterUniqueRangeDeleter(vm::Free, &idxDeleter); return RVALUE(UniqueRange(p, size, idxDeleter)); }
UniqueRange Allocate(size_t size, size_t alignment) { ENSURE(is_pow2(alignment)); if(alignment <= (size_t)idxDeleterBits) alignment = idxDeleterBits+1; const size_t alignedSize = round_up(size, alignment); const UniqueRange::pointer p = rtl_AllocateAligned(alignedSize, alignment); return RVALUE(UniqueRange(p, size, idxDeleterAligned)); }
UniqueRange AllocateAligned(size_t size, size_t alignment) { ENSURE(is_pow2(alignment)); alignment = std::max(alignment, allocationAlignment); const size_t alignedSize = round_up(size, alignment); const UniqueRange::pointer p = rtl_AllocateAligned(alignedSize, alignment); static volatile IdxDeleter idxDeleterAligned; if(idxDeleterAligned == 0) // (optional optimization) RegisterUniqueRangeDeleter(FreeAligned, &idxDeleterAligned); return RVALUE(UniqueRange(p, size, idxDeleterAligned)); }