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_FIXEDSIZE_H Chris@102: #define BOOST_CONTEXT_FIXEDSIZE_H Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #if defined(BOOST_USE_VALGRIND) Chris@102: #include Chris@102: #endif Chris@102: Chris@102: #ifdef BOOST_HAS_ABI_HEADERS Chris@102: # include BOOST_ABI_PREFIX Chris@102: #endif Chris@102: Chris@102: namespace boost { Chris@102: namespace context { Chris@102: Chris@102: template< typename traitsT > Chris@102: class basic_fixedsize_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_fixedsize_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: void * vp = std::malloc( size_); Chris@102: if ( ! vp) throw std::bad_alloc(); Chris@102: Chris@102: stack_context sctx; Chris@102: sctx.size = size_; Chris@102: sctx.sp = static_cast< char * >( vp) + sctx.size; Chris@102: #if defined(BOOST_USE_VALGRIND) Chris@102: sctx.valgrind_stack_id = VALGRIND_STACK_REGISTER( sctx.sp, vp); Chris@102: #endif Chris@102: return sctx; Chris@102: } Chris@102: Chris@102: void deallocate( stack_context & sctx) { Chris@102: BOOST_ASSERT( sctx.sp); Chris@102: BOOST_ASSERT( traits_type::minimum_size() <= sctx.size); Chris@102: BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= sctx.size) ); Chris@102: Chris@102: #if defined(BOOST_USE_VALGRIND) Chris@102: VALGRIND_STACK_DEREGISTER( sctx.valgrind_stack_id); Chris@102: #endif Chris@102: Chris@102: void * vp = static_cast< char * >( sctx.sp) - sctx.size; Chris@102: std::free( vp); Chris@102: } Chris@102: }; Chris@102: Chris@102: typedef basic_fixedsize_stack< stack_traits > fixedsize_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_FIXEDSIZE_H