+#if BOOST_VERSION < 106100
+ BoostContext* context = reinterpret_cast<BoostContext*>(arg);
+#else
+ ASAN_FINISH_SWITCH(nullptr, &static_cast<BoostContext**>(arg.data)[0]->asan_stack_,
+ &static_cast<BoostContext**>(arg.data)[0]->asan_stack_size_);
+ static_cast<BoostContext**>(arg.data)[0]->fc_ = arg.fctx;
+ BoostContext* context = static_cast<BoostContext**>(arg.data)[1];
+#endif
+ try {
+ (*context)();
+ context->Context::stop();
+ } catch (StopRequest const&) {
+ XBT_DEBUG("Caught a StopRequest");
+ }
+ ASAN_EVAL(context->asan_stop_ = true);
+ context->suspend();
+}
+
+inline void BoostContext::smx_ctx_boost_jump_fcontext(BoostContext* from, BoostContext* to)
+{
+#if BOOST_VERSION < 105600
+ boost::context::jump_fcontext(from->fc_, to->fc_, reinterpret_cast<intptr_t>(to));
+#elif BOOST_VERSION < 106100
+ boost::context::jump_fcontext(&from->fc_, to->fc_, reinterpret_cast<intptr_t>(to));
+#else
+ BoostContext* ctx[2] = {from, to};
+ void* fake_stack;
+ ASAN_START_SWITCH(from->asan_stop_ ? nullptr : &fake_stack, to->asan_stack_, to->asan_stack_size_);
+ boost::context::detail::transfer_t arg = boost::context::detail::jump_fcontext(to->fc_, ctx);
+ ASAN_FINISH_SWITCH(fake_stack, &static_cast<BoostContext**>(arg.data)[0]->asan_stack_,
+ &static_cast<BoostContext**>(arg.data)[0]->asan_stack_size_);
+ static_cast<BoostContext**>(arg.data)[0]->fc_ = arg.fctx;
+#endif