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_TRAMPOLINE_PUSH_H 8 #define BOOST_COROUTINES_DETAIL_TRAMPOLINE_PUSH_H 9 10 #include <cstddef> 11 12 #include <boost/assert.hpp> 13 #include <boost/config.hpp> 14 #include <boost/context/detail/fcontext.hpp> 15 #include <boost/cstdint.hpp> 16 #include <boost/exception_ptr.hpp> 17 #include <boost/move/move.hpp> 18 19 #include <boost/coroutine/detail/config.hpp> 20 #include <boost/coroutine/detail/data.hpp> 21 #include <boost/coroutine/detail/flags.hpp> 22 #include <boost/coroutine/detail/parameters.hpp> 23 #include <boost/coroutine/detail/setup.hpp> 24 #include <boost/coroutine/detail/setup.hpp> 25 #include <boost/coroutine/exceptions.hpp> 26 #include <boost/coroutine/flags.hpp> 27 28 #ifdef BOOST_HAS_ABI_HEADERS 29 # include BOOST_ABI_PREFIX 30 #endif 31 32 namespace boost { 33 namespace coroutines { 34 namespace detail { 35 36 template< typename Coro > trampoline_push(context::detail::transfer_t t)37void trampoline_push( context::detail::transfer_t t) 38 { 39 typedef typename Coro::param_type param_type; 40 41 data_t * data = static_cast< data_t * >( t.data); 42 data->from->ctx_ = t.fctx; 43 param_type * param( 44 static_cast< param_type * >( data->data) ); 45 BOOST_ASSERT( 0 != param); 46 BOOST_ASSERT( 0 != param->data); 47 48 Coro * coro( 49 static_cast< Coro * >( param->coro) ); 50 BOOST_ASSERT( 0 != coro); 51 52 coro->run( param->data); 53 } 54 55 template< typename Coro > trampoline_push_void(context::detail::transfer_t t)56void trampoline_push_void( context::detail::transfer_t t) 57 { 58 typedef typename Coro::param_type param_type; 59 60 data_t * data = static_cast< data_t * >( t.data); 61 data->from->ctx_ = t.fctx; 62 param_type * param( 63 static_cast< param_type * >( data->data) ); 64 BOOST_ASSERT( 0 != param); 65 66 Coro * coro( 67 static_cast< Coro * >( param->coro) ); 68 BOOST_ASSERT( 0 != coro); 69 70 coro->run(); 71 } 72 73 }}} 74 75 #ifdef BOOST_HAS_ABI_HEADERS 76 # include BOOST_ABI_SUFFIX 77 #endif 78 79 #endif // BOOST_COROUTINES_DETAIL_TRAMPOLINE_PUSH_H 80