explicit ucontext_context_impl(Functor & cb, std::ptrdiff_t stack_size) : m_stack_size(stack_size == -1 ? (std::ptrdiff_t)default_stack_size : stack_size), m_stack(alloc_stack(m_stack_size)), cb_(&cb) { HPX_ASSERT(m_stack); funp_ = &trampoline<Functor>; int error = HPX_COROUTINE_MAKE_CONTEXT( &m_ctx, m_stack, m_stack_size, funp_, cb_, nullptr); HPX_UNUSED(error); HPX_ASSERT(error == 0); #if defined(HPX_HAVE_THREAD_STACKOVERFLOW_DETECTION) // concept inspired by the following links: // // https://rethinkdb.com/blog/handling-stack-overflow-on-custom-stacks/ // http://www.evanjones.ca/software/threading.html // segv_stack.ss_sp = valloc(SEGV_STACK_SIZE); segv_stack.ss_flags = 0; segv_stack.ss_size = SEGV_STACK_SIZE; std::memset(&action, '\0', sizeof(action)); action.sa_flags = SA_SIGINFO|SA_ONSTACK; //SA_STACK action.sa_sigaction = &ucontext_context_impl::sigsegv_handler; sigaltstack(&segv_stack, nullptr); sigfillset(&action.sa_mask); sigaction(SIGSEGV, &action, nullptr); #endif }
void rebind_stack() { if (m_stack) { // just reset the context stack pointer to its initial value at the stack start increment_stack_recycle_count(); int error = HPX_COROUTINE_MAKE_CONTEXT( &m_ctx, m_stack, m_stack_size, (void (*)(void*))(funp_), &cb_, NULL); HPX_UNUSED(error); HPX_ASSERT(error == 0); } }
explicit ucontext_context_impl(Functor& cb, std::ptrdiff_t stack_size) : m_stack_size(stack_size == -1? default_stack_size: stack_size), m_stack(alloc_stack(m_stack_size)) { HPX_ASSERT(m_stack); typedef void cb_type(Functor*); cb_type * cb_ptr = &trampoline<Functor>; int error = HPX_COROUTINE_MAKE_CONTEXT( &m_ctx, m_stack, m_stack_size, (void (*)(void*))(cb_ptr), &cb, NULL); HPX_UNUSED(error); HPX_ASSERT(error == 0); }
explicit ucontext_context_impl(Functor& cb, std::ptrdiff_t stack_size) : m_stack_size(stack_size == -1 ? (std::ptrdiff_t)default_stack_size : stack_size), m_stack(alloc_stack(m_stack_size)), cb_(cb) { HPX_ASSERT(m_stack); funp_ = &trampoline<Functor>; int error = HPX_COROUTINE_MAKE_CONTEXT( &m_ctx, m_stack, m_stack_size, (void (*)(void*))(funp_), &cb_, NULL); HPX_UNUSED(error); HPX_ASSERT(error == 0); }