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