From 823ecf8917d7f0534ed02b8d38bfc966cb0fd7b6 Mon Sep 17 00:00:00 2001 From: Andrii Grynenko Date: Mon, 31 Oct 2016 18:16:50 -0700 Subject: [PATCH] Fix BoostContextCompatibility for boost >= 1.61 Reviewed By: yfeldblum Differential Revision: D4100221 fbshipit-source-id: 7778b48f1bba9be85f5712f61d6e1731524901c3 --- folly/fibers/BoostContextCompatibility.h | 42 ++++++++++++++++++++---- folly/m4/ax_boost_context.m4 | 12 +++++-- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/folly/fibers/BoostContextCompatibility.h b/folly/fibers/BoostContextCompatibility.h index f4dd1ce8..4f2dde14 100644 --- a/folly/fibers/BoostContextCompatibility.h +++ b/folly/fibers/BoostContextCompatibility.h @@ -15,8 +15,12 @@ */ #pragma once -#include #include +#if BOOST_VERSION >= 106100 +#include +#else +#include +#endif #include /** @@ -28,13 +32,17 @@ * http://www.boost.org/doc/libs/1_52_0/libs/context/doc/html/context/context/boost_fcontext.html * Boost 1.56: * http://www.boost.org/doc/libs/1_56_0/libs/context/doc/html/context/context/boost_fcontext.html + * Boost 1.61: + * https://github.com/boostorg/context/blob/boost-1.61.0/include/boost/context/detail/fcontext.hpp */ namespace folly { namespace fibers { class FiberImpl { -#if BOOST_VERSION >= 105600 +#if BOOST_VERSION >= 106100 + using FiberContext = boost::context::detail::fcontext_t; +#elif BOOST_VERSION >= 105600 using FiberContext = boost::context::fcontext_t; #elif BOOST_VERSION >= 105200 using FiberContext = boost::context::fcontext_t*; @@ -42,7 +50,9 @@ class FiberImpl { using FiberContext = boost::ctx::fcontext_t; #endif -#if BOOST_VERSION >= 105600 +#if BOOST_VERSION >= 106100 + using MainContext = boost::context::detail::fcontext_t; +#elif BOOST_VERSION >= 105600 using MainContext = boost::context::fcontext_t; #elif BOOST_VERSION >= 105200 using MainContext = boost::context::fcontext_t; @@ -57,8 +67,10 @@ class FiberImpl { size_t stackSize) : func_(std::move(func)) { auto stackBase = stackLimit + stackSize; - -#if BOOST_VERSION >= 105200 +#if BOOST_VERSION >= 106100 + fiberContext_ = + boost::context::detail::make_fcontext(stackBase, stackSize, &fiberFunc); +#elif BOOST_VERSION >= 105200 fiberContext_ = boost::context::make_fcontext(stackBase, stackSize, &fiberFunc); #else @@ -69,7 +81,11 @@ class FiberImpl { } void activate() { -#if BOOST_VERSION >= 105200 +#if BOOST_VERSION >= 106100 + auto transfer = boost::context::detail::jump_fcontext(fiberContext_, this); + fiberContext_ = transfer.fctx; + auto context = reinterpret_cast(transfer.data); +#elif BOOST_VERSION >= 105200 auto context = boost::context::jump_fcontext( &mainContext_, fiberContext_, reinterpret_cast(this)); #else @@ -80,7 +96,11 @@ class FiberImpl { } void deactivate() { -#if BOOST_VERSION >= 105600 +#if BOOST_VERSION >= 106100 + auto transfer = boost::context::detail::jump_fcontext(mainContext_, 0); + mainContext_ = transfer.fctx; + auto context = reinterpret_cast(transfer.data); +#elif BOOST_VERSION >= 105600 auto context = boost::context::jump_fcontext(&fiberContext_, mainContext_, 0); #elif BOOST_VERSION >= 105200 @@ -93,10 +113,18 @@ class FiberImpl { } private: +#if BOOST_VERSION >= 106100 + static void fiberFunc(boost::context::detail::transfer_t transfer) { + auto fiberImpl = reinterpret_cast(transfer.data); + fiberImpl->mainContext_ = transfer.fctx; + fiberImpl->func_(); + } +#else static void fiberFunc(intptr_t arg) { auto fiberImpl = reinterpret_cast(arg); fiberImpl->func_(); } +#endif folly::Function func_; FiberContext fiberContext_; diff --git a/folly/m4/ax_boost_context.m4 b/folly/m4/ax_boost_context.m4 index 46517c97..47f79471 100644 --- a/folly/m4/ax_boost_context.m4 +++ b/folly/m4/ax_boost_context.m4 @@ -69,10 +69,16 @@ AC_DEFUN([AX_BOOST_CONTEXT], CXXFLAGS_SAVE=$CXXFLAGS AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [[@%:@include -#include + [[@%:@include +#if BOOST_VERSION >= 106100 +#include +#else +#include +#endif ]], - [[#if BOOST_VERSION >= 105600 + [[#if BOOST_VERSION >= 106100 + boost::context::detail::fcontext_t fc = boost::context::detail::make_fcontext(0, 0, 0); +#elif BOOST_VERSION >= 105600 boost::context::fcontext_t fc = boost::context::make_fcontext(0, 0, 0); #else boost::context::fcontext_t* fc = boost::context::make_fcontext(0, 0, 0); -- 2.34.1