diff options
Diffstat (limited to 'boost/coroutine/detail/trampoline.hpp')
-rw-r--r-- | boost/coroutine/detail/trampoline.hpp | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/boost/coroutine/detail/trampoline.hpp b/boost/coroutine/detail/trampoline.hpp index 1cb3226d15..eb0c6c2378 100644 --- a/boost/coroutine/detail/trampoline.hpp +++ b/boost/coroutine/detail/trampoline.hpp @@ -9,9 +9,11 @@ #include <boost/assert.hpp> #include <boost/config.hpp> +#include <boost/context/detail/fcontext.hpp> #include <boost/cstdint.hpp> #include <boost/coroutine/detail/config.hpp> +#include <boost/coroutine/detail/data.hpp> #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_PREFIX @@ -22,37 +24,37 @@ namespace coroutines { namespace detail { template< typename Coro > -void trampoline( intptr_t vp) +void trampoline( context::detail::transfer_t t) { typedef typename Coro::param_type param_type; - BOOST_ASSERT( 0 != vp); - + data_t * data = static_cast< data_t * >( t.data); + data->from->ctx_ = t.fctx; param_type * param( - reinterpret_cast< param_type * >( vp) ); + static_cast< param_type * >( data->data) ); BOOST_ASSERT( 0 != param); BOOST_ASSERT( 0 != param->data); Coro * coro( - reinterpret_cast< Coro * >( param->coro) ); + static_cast< Coro * >( param->coro) ); BOOST_ASSERT( 0 != coro); coro->run( param->data); } template< typename Coro > -void trampoline_void( intptr_t vp) +void trampoline_void( context::detail::transfer_t t) { typedef typename Coro::param_type param_type; - BOOST_ASSERT( 0 != vp); - + data_t * data = static_cast< data_t * >( t.data); + data->from->ctx_ = t.fctx; param_type * param( - reinterpret_cast< param_type * >( vp) ); + static_cast< param_type * >( data->data) ); BOOST_ASSERT( 0 != param); Coro * coro( - reinterpret_cast< Coro * >( param->coro) ); + static_cast< Coro * >( param->coro) ); BOOST_ASSERT( 0 != coro); coro->run(); |