X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=blobdiff_plain;f=folly%2Ffibers%2FBoostContextCompatibility.h;h=4f2dde146b3b72c98f02ec5c3a0951c81fc90fd1;hp=f4dd1ce876ed5395c053c56b58baa4eb3cbdd25f;hb=823ecf8917d7f0534ed02b8d38bfc966cb0fd7b6;hpb=101918916e04b2367532478a1b09efdc794f2b8a 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_;