Chris@102: Chris@102: // Copyright Oliver Kowalke 2014. Chris@102: // Distributed under the Boost Software License, Version 1.0. Chris@102: // (See accompanying file LICENSE_1_0.txt or copy at Chris@102: // http://www.boost.org/LICENSE_1_0.txt) Chris@102: Chris@102: #ifndef BOOST_CONTEXT_SEGMENTED_H Chris@102: #define BOOST_CONTEXT_SEGMENTED_H Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #ifdef BOOST_HAS_ABI_HEADERS Chris@102: # include BOOST_ABI_PREFIX Chris@102: #endif Chris@102: Chris@102: // forward declaration for splitstack-functions defined in libgcc Chris@102: extern "C" { Chris@102: void *__splitstack_makecontext( std::size_t, Chris@102: void * [BOOST_CONTEXT_SEGMENTS], Chris@102: std::size_t *); Chris@102: Chris@102: void __splitstack_releasecontext( void * [BOOST_CONTEXT_SEGMENTS]); Chris@102: Chris@102: void __splitstack_resetcontext( void * [BOOST_CONTEXT_SEGMENTS]); Chris@102: Chris@102: void __splitstack_block_signals_context( void * [BOOST_CONTEXT_SEGMENTS], Chris@102: int * new_value, int * old_value); Chris@102: } Chris@102: Chris@102: namespace boost { Chris@102: namespace context { Chris@102: Chris@102: template< typename traitsT > Chris@102: class basic_segmented_stack { Chris@102: private: Chris@102: std::size_t size_; Chris@102: Chris@102: public: Chris@102: typedef traitsT traits_type; Chris@102: Chris@102: basic_segmented_stack( std::size_t size = traits_type::default_size() ) : Chris@102: size_( size) { Chris@102: BOOST_ASSERT( traits_type::minimum_size() <= size_); Chris@102: BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size_) ); Chris@102: } Chris@102: Chris@102: stack_context allocate() { Chris@102: stack_context sctx; Chris@102: void * vp = __splitstack_makecontext( size_, sctx.segments_ctx, & sctx.size); Chris@102: if ( ! vp) throw std::bad_alloc(); Chris@102: Chris@102: // sctx.size is already filled by __splitstack_makecontext Chris@102: sctx.sp = static_cast< char * >( vp) + sctx.size; Chris@102: Chris@102: int off = 0; Chris@102: __splitstack_block_signals_context( sctx.segments_ctx, & off, 0); Chris@102: Chris@102: return sctx; Chris@102: } Chris@102: Chris@102: void deallocate( stack_context & sctx) { Chris@102: __splitstack_releasecontext( sctx.segments_ctx); Chris@102: } Chris@102: }; Chris@102: Chris@102: typedef basic_segmented_stack< stack_traits > segmented_stack; Chris@102: Chris@102: }} Chris@102: Chris@102: #ifdef BOOST_HAS_ABI_HEADERS Chris@102: # include BOOST_ABI_SUFFIX Chris@102: #endif Chris@102: Chris@102: #endif // BOOST_CONTEXT_SEGMENTED_H