• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "boost/coroutine/detail/coroutine_context.hpp"
8 
9 #include "boost/coroutine/detail/data.hpp"
10 
11 #ifdef BOOST_HAS_ABI_HEADERS
12 #  include BOOST_ABI_PREFIX
13 #endif
14 
15 #if defined(_MSC_VER)
16 # pragma warning(push)
17 # pragma warning(disable:4355)
18 #endif
19 
20 #if defined(BOOST_USE_SEGMENTED_STACKS)
21 extern "C" {
22 
23 void __splitstack_getcontext( void * [BOOST_CONTEXT_SEGMENTS]);
24 
25 void __splitstack_setcontext( void * [BOOST_CONTEXT_SEGMENTS]);
26 
27 }
28 #endif
29 
30 namespace boost {
31 namespace coroutines {
32 namespace detail {
33 
coroutine_context()34 coroutine_context::coroutine_context() :
35     palloc_(),
36     ctx_( 0)
37 {}
38 
coroutine_context(ctx_fn fn,preallocated const & palloc)39 coroutine_context::coroutine_context( ctx_fn fn, preallocated const& palloc) :
40     palloc_( palloc),
41     ctx_( context::detail::make_fcontext( palloc_.sp, palloc_.size, fn) )
42 {}
43 
coroutine_context(coroutine_context const & other)44 coroutine_context::coroutine_context( coroutine_context const& other) :
45     palloc_( other.palloc_),
46     ctx_( other.ctx_)
47 {}
48 
49 coroutine_context &
operator =(coroutine_context const & other)50 coroutine_context::operator=( coroutine_context const& other)
51 {
52     if ( this == & other) return * this;
53 
54     palloc_ = other.palloc_;
55     ctx_ = other.ctx_;
56 
57     return * this;
58 }
59 
60 void *
jump(coroutine_context & other,void * param)61 coroutine_context::jump( coroutine_context & other, void * param)
62 {
63 #if defined(BOOST_USE_SEGMENTED_STACKS)
64     __splitstack_getcontext( palloc_.sctx.segments_ctx);
65     __splitstack_setcontext( other.palloc_.sctx.segments_ctx);
66 #endif
67     data_t data = { this, param };
68     context::detail::transfer_t t = context::detail::jump_fcontext( other.ctx_, & data);
69     data_t * ret = static_cast< data_t * >( t.data);
70     ret->from->ctx_ = t.fctx;
71     return ret->data;
72 }
73 
74 }}}
75 
76 #if defined(_MSC_VER)
77 # pragma warning(pop)
78 #endif
79 
80 #ifdef BOOST_HAS_ABI_HEADERS
81 #  include BOOST_ABI_SUFFIX
82 #endif
83