use malloc on systems without MAP_ANON/ANONYMOUS (they're not in POSIX)

This commit is contained in:
q66 2017-03-07 22:48:44 +01:00
parent 58206da3b4
commit c526f12b81

View file

@ -180,6 +180,17 @@ inline size_t context_stack_get_def_size() {
return r; return r;
} }
#if defined(MAP_ANON) || defined(MAP_ANONYMOUS)
constexpr bool CONTEXT_USE_MMAP = true;
# ifdef MAP_ANON
constexpr auto CONTEXT_MAP_ANON = MAP_ANON;
# else
constexpr auto CONTEXT_MAP_ANON = MAP_ANONYMOUS;
# endif
#else
constexpr bool CONTEXT_USE_MMAP = false;
#endif
#else /* OSTD_PLATFORM_POSIX */ #else /* OSTD_PLATFORM_POSIX */
# error "Unsupported platform" # error "Unsupported platform"
#endif #endif
@ -204,16 +215,19 @@ inline context_stack_t context_stack_alloc(size_t ss) {
DWORD oo; DWORD oo;
VirtualProtect(p, pgs, PAGE_READWRITE | PAGE_GUARD, &oo); VirtualProtect(p, pgs, PAGE_READWRITE | PAGE_GUARD, &oo);
#elif defined(OSTD_PLATFORM_POSIX) #elif defined(OSTD_PLATFORM_POSIX)
void *p = mmap( void *p = nullptr;
0, asize, PROT_READ | PROT_WRITE, if constexpr(CONTEXT_USE_MMAP) {
# ifdef MAP_ANON void *mp = mmap(
MAP_PRIVATE | MAP_ANON, 0, asize, PROT_READ | PROT_WRITE,
# else MAP_PRIVATE | CONTEXT_MAP_ANON, -1, 0
MAP_PRIVATE | MAP_ANONYMOUS, );
# endif if (mp != MAP_FAILED) {
-1, 0 p = mp;
); }
if (p == MAP_FAILED) { } else {
p = std::malloc(asize);
}
if (!p) {
throw std::bad_alloc{}; throw std::bad_alloc{};
} }
mprotect(p, pgs, PROT_NONE); mprotect(p, pgs, PROT_NONE);
@ -231,7 +245,11 @@ inline void context_stack_free(context_stack_t &st) {
#if defined(OSTD_PLATFORM_WIN32) #if defined(OSTD_PLATFORM_WIN32)
VirtualFree(p, 0, MEM_RELEASE); VirtualFree(p, 0, MEM_RELEASE);
#elif defined(OSTD_PLATFORM_POSIX) #elif defined(OSTD_PLATFORM_POSIX)
munmap(p, st.size); if constexpr(CONTEXT_USE_MMAP) {
munmap(p, st.size);
} else {
std::free(p);
}
#endif #endif
st.ptr = nullptr; st.ptr = nullptr;