1 2 // Copyright Oliver Kowalke 2009. 3 // Distributed under the Boost Software License, Version 1.0. 4 // (See accompanying file LICENSE_1_0.txt or copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 7 #ifndef BOOST_COROUTINES_STANDARD_STACK_ALLOCATOR_H 8 #define BOOST_COROUTINES_STANDARD_STACK_ALLOCATOR_H 9 10 #if defined(BOOST_USE_VALGRIND) 11 #include <valgrind/valgrind.h> 12 #endif 13 14 #include <cstddef> 15 #include <cstdlib> 16 #include <new> 17 18 #include <boost/assert.hpp> 19 #include <boost/config.hpp> 20 21 #include <boost/coroutine/detail/config.hpp> 22 #include <boost/coroutine/stack_context.hpp> 23 #include <boost/coroutine/stack_traits.hpp> 24 25 #ifdef BOOST_HAS_ABI_HEADERS 26 # include BOOST_ABI_PREFIX 27 #endif 28 29 namespace boost { 30 namespace coroutines { 31 32 template< typename traitsT > 33 struct basic_standard_stack_allocator 34 { 35 typedef traitsT traits_type; 36 allocateboost::coroutines::basic_standard_stack_allocator37 void allocate( stack_context & ctx, std::size_t size = traits_type::minimum_size() ) 38 { 39 BOOST_ASSERT( traits_type::minimum_size() <= size); 40 BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size) ); 41 42 void * limit = std::malloc( size); 43 if ( ! limit) throw std::bad_alloc(); 44 45 ctx.size = size; 46 ctx.sp = static_cast< char * >( limit) + ctx.size; 47 #if defined(BOOST_USE_VALGRIND) 48 ctx.valgrind_stack_id = VALGRIND_STACK_REGISTER( ctx.sp, limit); 49 #endif 50 } 51 deallocateboost::coroutines::basic_standard_stack_allocator52 void deallocate( stack_context & ctx) 53 { 54 BOOST_ASSERT( ctx.sp); 55 BOOST_ASSERT( traits_type::minimum_size() <= ctx.size); 56 BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= ctx.size) ); 57 58 #if defined(BOOST_USE_VALGRIND) 59 VALGRIND_STACK_DEREGISTER( ctx.valgrind_stack_id); 60 #endif 61 62 void * limit = static_cast< char * >( ctx.sp) - ctx.size; 63 std::free( limit); 64 } 65 }; 66 67 typedef basic_standard_stack_allocator< stack_traits > standard_stack_allocator; 68 69 }} 70 71 #ifdef BOOST_HAS_ABI_HEADERS 72 # include BOOST_ABI_SUFFIX 73 #endif 74 75 #endif // BOOST_COROUTINES_STANDARD_STACK_ALLOCATOR_H 76