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)
21extern "C" {
22
23void __splitstack_getcontext( void * [BOOST_CONTEXT_SEGMENTS]);
24
25void __splitstack_setcontext( void * [BOOST_CONTEXT_SEGMENTS]);
26
27}
28#endif
29
30namespace boost {
31namespace coroutines {
32namespace detail {
33
34coroutine_context::coroutine_context() :
35 palloc_(),
36 ctx_( 0)
37{}
38
39coroutine_context::coroutine_context( ctx_fn fn, preallocated const& palloc) :
40 palloc_( palloc),
41 ctx_( context::detail::make_fcontext( sp: palloc_.sp, size: palloc_.size, fn) )
42{}
43
44coroutine_context::coroutine_context( coroutine_context const& other) :
45 palloc_( other.palloc_),
46 ctx_( other.ctx_)
47{}
48
49coroutine_context &
50coroutine_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
60void *
61coroutine_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 = { .from: this, .data: param };
68 context::detail::transfer_t t = context::detail::jump_fcontext( to: other.ctx_, vp: & 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

source code of boost/libs/coroutine/src/detail/coroutine_context.cpp