• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 //          Copyright Oliver Kowalke 2014.
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_CONTEXT_SEGMENTED_H
8 #define BOOST_CONTEXT_SEGMENTED_H
9 
10 #include <cstddef>
11 #include <new>
12 
13 #include <boost/config.hpp>
14 
15 #include <boost/context/detail/config.hpp>
16 #include <boost/context/stack_context.hpp>
17 #include <boost/context/stack_traits.hpp>
18 
19 #ifdef BOOST_HAS_ABI_HEADERS
20 #  include BOOST_ABI_PREFIX
21 #endif
22 
23 // forward declaration for splitstack-functions defined in libgcc
24 extern "C" {
25 void *__splitstack_makecontext( std::size_t,
26                                 void * [BOOST_CONTEXT_SEGMENTS],
27                                 std::size_t *);
28 
29 void __splitstack_releasecontext( void * [BOOST_CONTEXT_SEGMENTS]);
30 
31 void __splitstack_resetcontext( void * [BOOST_CONTEXT_SEGMENTS]);
32 
33 void __splitstack_block_signals_context( void * [BOOST_CONTEXT_SEGMENTS],
34                                          int * new_value, int * old_value);
35 }
36 
37 namespace boost {
38 namespace context {
39 
40 template< typename traitsT >
41 class basic_segmented_stack {
42 private:
43     std::size_t     size_;
44 
45 public:
46     typedef traitsT traits_type;
47 
basic_segmented_stack(std::size_t size=traits_type::default_size ())48     basic_segmented_stack( std::size_t size = traits_type::default_size() ) BOOST_NOEXCEPT_OR_NOTHROW :
49         size_( size) {
50     }
51 
allocate()52     stack_context allocate() {
53         stack_context sctx;
54         void * vp = __splitstack_makecontext( size_, sctx.segments_ctx, & sctx.size);
55         if ( ! vp) throw std::bad_alloc();
56 
57         // sctx.size is already filled by __splitstack_makecontext
58         sctx.sp = static_cast< char * >( vp) + sctx.size;
59 
60         int off = 0;
61         __splitstack_block_signals_context( sctx.segments_ctx, & off, 0);
62 
63         return sctx;
64     }
65 
deallocate(stack_context & sctx)66     void deallocate( stack_context & sctx) BOOST_NOEXCEPT_OR_NOTHROW {
67         __splitstack_releasecontext( sctx.segments_ctx);
68     }
69 };
70 
71 typedef basic_segmented_stack< stack_traits > segmented_stack;
72 # if defined(BOOST_USE_SEGMENTED_STACKS)
73 typedef segmented_stack default_stack;
74 # endif
75 
76 }}
77 
78 #ifdef BOOST_HAS_ABI_HEADERS
79 #  include BOOST_ABI_SUFFIX
80 #endif
81 
82 #endif // BOOST_CONTEXT_SEGMENTED_H
83