annotate DEPENDENCIES/generic/include/boost/context/posix/segmented_stack.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents f46d142149f5
children
rev   line source
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_SEGMENTED_H
Chris@102 8 #define BOOST_CONTEXT_SEGMENTED_H
Chris@102 9
Chris@102 10 #include <cstddef>
Chris@102 11 #include <new>
Chris@102 12
Chris@102 13 #include <boost/config.hpp>
Chris@102 14
Chris@102 15 #include <boost/context/detail/config.hpp>
Chris@102 16 #include <boost/context/stack_context.hpp>
Chris@102 17 #include <boost/context/stack_traits.hpp>
Chris@102 18
Chris@102 19 #ifdef BOOST_HAS_ABI_HEADERS
Chris@102 20 # include BOOST_ABI_PREFIX
Chris@102 21 #endif
Chris@102 22
Chris@102 23 // forward declaration for splitstack-functions defined in libgcc
Chris@102 24 extern "C" {
Chris@102 25 void *__splitstack_makecontext( std::size_t,
Chris@102 26 void * [BOOST_CONTEXT_SEGMENTS],
Chris@102 27 std::size_t *);
Chris@102 28
Chris@102 29 void __splitstack_releasecontext( void * [BOOST_CONTEXT_SEGMENTS]);
Chris@102 30
Chris@102 31 void __splitstack_resetcontext( void * [BOOST_CONTEXT_SEGMENTS]);
Chris@102 32
Chris@102 33 void __splitstack_block_signals_context( void * [BOOST_CONTEXT_SEGMENTS],
Chris@102 34 int * new_value, int * old_value);
Chris@102 35 }
Chris@102 36
Chris@102 37 namespace boost {
Chris@102 38 namespace context {
Chris@102 39
Chris@102 40 template< typename traitsT >
Chris@102 41 class basic_segmented_stack {
Chris@102 42 private:
Chris@102 43 std::size_t size_;
Chris@102 44
Chris@102 45 public:
Chris@102 46 typedef traitsT traits_type;
Chris@102 47
Chris@102 48 basic_segmented_stack( std::size_t size = traits_type::default_size() ) :
Chris@102 49 size_( size) {
Chris@102 50 BOOST_ASSERT( traits_type::minimum_size() <= size_);
Chris@102 51 BOOST_ASSERT( traits_type::is_unbounded() || ( traits_type::maximum_size() >= size_) );
Chris@102 52 }
Chris@102 53
Chris@102 54 stack_context allocate() {
Chris@102 55 stack_context sctx;
Chris@102 56 void * vp = __splitstack_makecontext( size_, sctx.segments_ctx, & sctx.size);
Chris@102 57 if ( ! vp) throw std::bad_alloc();
Chris@102 58
Chris@102 59 // sctx.size is already filled by __splitstack_makecontext
Chris@102 60 sctx.sp = static_cast< char * >( vp) + sctx.size;
Chris@102 61
Chris@102 62 int off = 0;
Chris@102 63 __splitstack_block_signals_context( sctx.segments_ctx, & off, 0);
Chris@102 64
Chris@102 65 return sctx;
Chris@102 66 }
Chris@102 67
Chris@102 68 void deallocate( stack_context & sctx) {
Chris@102 69 __splitstack_releasecontext( sctx.segments_ctx);
Chris@102 70 }
Chris@102 71 };
Chris@102 72
Chris@102 73 typedef basic_segmented_stack< stack_traits > segmented_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_SEGMENTED_H