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