Expose reserve_at_least in all Pals
This commit is contained in:
committed by
Matthew Parkinson
parent
2ba0de76b3
commit
8b1ffbc166
@@ -49,9 +49,10 @@ template<bool committed>
|
|||||||
static void* reserve_aligned(size_t size) noexcept;
|
static void* reserve_aligned(size_t size) noexcept;
|
||||||
static std::pair<void*, size_t> reserve_at_least(size_t size) noexcept;
|
static std::pair<void*, size_t> reserve_at_least(size_t size) noexcept;
|
||||||
```
|
```
|
||||||
Only one of these needs to be implemented, depending on whether the underlying
|
All platforms should provide `reserve_at_least` and can optionally provide
|
||||||
system can provide strongly aligned memory regions.
|
`reserve_aligned` if the underlying system can provide strongly aligned
|
||||||
If the system guarantees only page alignment, implement the second. The Pal is
|
memory regions.
|
||||||
|
If the system guarantees only page alignment, implement only the second. The Pal is
|
||||||
free to overallocate based on the platform's desire and snmalloc
|
free to overallocate based on the platform's desire and snmalloc
|
||||||
will find suitably aligned blocks inside the region. `reserve_at_least` should
|
will find suitably aligned blocks inside the region. `reserve_at_least` should
|
||||||
not commit memory as snmalloc will commit the range of memory it requires of what
|
not commit memory as snmalloc will commit the range of memory it requires of what
|
||||||
|
|||||||
@@ -50,17 +50,5 @@ namespace snmalloc
|
|||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Explicitly deleted method for returning non-aligned memory. This causes
|
|
||||||
* incorrect use of `constexpr if` to fail on platforms with aligned
|
|
||||||
* allocation. Without this, this PAL and its subclasses exported both
|
|
||||||
* allocation functions and so callers would type-check if they called
|
|
||||||
* either in `constexpr if` branches and then fail on platforms such as
|
|
||||||
* Linux or Windows, which expose only unaligned or aligned allocations,
|
|
||||||
* respectively.
|
|
||||||
*/
|
|
||||||
static std::pair<void*, size_t>
|
|
||||||
reserve_at_least(size_t size) noexcept = delete;
|
|
||||||
};
|
};
|
||||||
} // namespace snmalloc
|
} // namespace snmalloc
|
||||||
|
|||||||
@@ -152,38 +152,7 @@ namespace snmalloc
|
|||||||
::memset(p, 0, size);
|
::memset(p, 0, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef USE_SYSTEMATIC_TESTING
|
# ifdef PLATFORM_HAS_VIRTUALALLOC2
|
||||||
static size_t& systematic_bump_ptr()
|
|
||||||
{
|
|
||||||
static size_t bump_ptr = (size_t)0x4000'0000'0000;
|
|
||||||
return bump_ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::pair<void*, size_t> reserve_at_least(size_t size) noexcept
|
|
||||||
{
|
|
||||||
// Magic number for over-allocating chosen by the Pal
|
|
||||||
// These should be further refined based on experiments.
|
|
||||||
constexpr size_t min_size =
|
|
||||||
bits::is64() ? bits::one_at_bit(32) : bits::one_at_bit(28);
|
|
||||||
auto size_request = bits::max(size, min_size);
|
|
||||||
|
|
||||||
DWORD flags = MEM_RESERVE;
|
|
||||||
|
|
||||||
size_t retries = 1000;
|
|
||||||
void* p;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
p = VirtualAlloc(
|
|
||||||
(void*)systematic_bump_ptr(), size_request, flags, PAGE_READWRITE);
|
|
||||||
|
|
||||||
systematic_bump_ptr() += size_request;
|
|
||||||
retries--;
|
|
||||||
} while (p == nullptr && retries > 0);
|
|
||||||
|
|
||||||
return {p, size_request};
|
|
||||||
}
|
|
||||||
# elif defined(PLATFORM_HAS_VIRTUALALLOC2)
|
|
||||||
template<bool committed>
|
template<bool committed>
|
||||||
static void* reserve_aligned(size_t size) noexcept
|
static void* reserve_aligned(size_t size) noexcept
|
||||||
{
|
{
|
||||||
@@ -214,7 +183,8 @@ namespace snmalloc
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
# else
|
# endif
|
||||||
|
|
||||||
static std::pair<void*, size_t> reserve_at_least(size_t size) noexcept
|
static std::pair<void*, size_t> reserve_at_least(size_t size) noexcept
|
||||||
{
|
{
|
||||||
SNMALLOC_ASSERT(bits::is_pow2(size));
|
SNMALLOC_ASSERT(bits::is_pow2(size));
|
||||||
@@ -236,7 +206,6 @@ namespace snmalloc
|
|||||||
}
|
}
|
||||||
error("Failed to allocate memory\n");
|
error("Failed to allocate memory\n");
|
||||||
}
|
}
|
||||||
# endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Source of Entropy
|
* Source of Entropy
|
||||||
|
|||||||
Reference in New Issue
Block a user