Beispiel #1
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, 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
            }
Beispiel #2
0
 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);
   }
 }
Beispiel #3
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);
 }
Beispiel #4
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);
 }