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 #ifndef BOOST_COROUTINES_DETAIL_COROUTINE_CONTEXT_H
8 #define BOOST_COROUTINES_DETAIL_COROUTINE_CONTEXT_H
9 
10 #include <cstddef>
11 
12 #include <boost/assert.hpp>
13 #include <boost/config.hpp>
14 #include <boost/context/detail/fcontext.hpp>
15 
16 #include <boost/coroutine/detail/config.hpp>
17 #include <boost/coroutine/detail/preallocated.hpp>
18 #include <boost/coroutine/stack_context.hpp>
19 
20 #ifdef BOOST_HAS_ABI_HEADERS
21 #  include BOOST_ABI_PREFIX
22 #endif
23 
24 namespace boost {
25 namespace coroutines {
26 namespace detail {
27 
28 // class hold stack-context and coroutines execution-context
29 class BOOST_COROUTINES_DECL coroutine_context
30 {
31 private:
32     template< typename Coro >
33     friend void trampoline( context::detail::transfer_t);
34     template< typename Coro >
35     friend void trampoline_void( context::detail::transfer_t);
36     template< typename Coro >
37     friend void trampoline_pull( context::detail::transfer_t);
38     template< typename Coro >
39     friend void trampoline_push( context::detail::transfer_t);
40     template< typename Coro >
41     friend void trampoline_push_void( context::detail::transfer_t);
42 
43     preallocated            palloc_;
44     context::detail::fcontext_t     ctx_;
45 
46 public:
47     typedef void( * ctx_fn)( context::detail::transfer_t);
48 
49     // default ctor represents the current execution-context
50     coroutine_context();
51 
52     // ctor creates a new execution-context running coroutine-fn `fn`
53     // `ctx_` will be allocated on top of the stack managed by parameter
54     // `stack_ctx`
55     coroutine_context( ctx_fn fn, preallocated const& palloc);
56 
57     coroutine_context( coroutine_context const&);
58 
59     coroutine_context& operator=( coroutine_context const&);
60 
61     void * jump( coroutine_context &, void * = 0);
62 
stack_ctx()63     stack_context & stack_ctx()
64     { return palloc_.sctx; }
65 };
66 
67 }}}
68 
69 #ifdef BOOST_HAS_ABI_HEADERS
70 #  include BOOST_ABI_SUFFIX
71 #endif
72 
73 #endif // BOOST_COROUTINES_DETAIL_COROUTINE_CONTEXT_H
74