7e14ab9e45
Since OpenBSD 6.4 (https://www.openbsd.org/64.html), the stack pointer must point to MAP_STACK memory, or the kernel may kill the process with a signal. All stack allocators must pass MAP_STACK to mmap(2). Define BOOST_CONTEXT_USE_MAP_STACK on OpenBSD, and don't define it on other systems. This doesn't check for old versions of OpenBSD without MAP_STACK; but OpenBSD has stopped maintaining versions before 6.4. If BOOST_CONTEXT_USE_MAP_STACK is defined, then cause the stack allocators to pass MAP_STACK to mmap(2): - fixedsize_stack uses mmap/munmap instead of malloc/free. This comes from a patch in OpenBSD Ports. - protected_fixedsize_stack adds MAP_STACK to the mmap flags (as it does in OpenBSD Ports). Assume that systems with MAP_STACK also have MAP_ANON; this is true on OpenBSD. Delete POSIX comment, because I can't find MAP_ANON nor MAP_ANONYMOUS in POSIX, so these mmap calls don't conform to POSIX. - pooled_fixedsize_stack can't call munmap, because the pool's free doesn't know the allocation's size. Instead use posix_memalign to allocate memory, then mmap to replace the pages with MAP_STACK pages, so the pool's free may call std::free. OpenBSD has no <ucontext.h>, so edit test/Jamfile.v2 to skip ucontext tests on OpenBSD. This commit and https://github.com/boostorg/test/pull/231 causes libs/context/test `b2 full` to pass on OpenBSD 6.5 for 64-bit x86. `b2 fc` fails because the allocator in test_fcontext.cpp does not use MAP_STACK. The tests seem not to cover pooled_fixedsize_stack nor protected_fixedsize_stack, but they still pass when I temporarily hack callcc to use those allocators instead of fixedsize_stack. |
||
---|---|---|
.. | ||
Jamfile.v2 | ||
test_apply.cpp | ||
test_callcc.cpp | ||
test_fcontext.cpp | ||
test_fiber.cpp | ||
test_invoke.cpp |