forked from OctaForge/libostd
use malloc on systems without MAP_ANON/ANONYMOUS (they're not in POSIX)
This commit is contained in:
parent
58206da3b4
commit
c526f12b81
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue