Commit 823ecf89 authored by Andrii Grynenko's avatar Andrii Grynenko Committed by Facebook Github Bot

Fix BoostContextCompatibility for boost >= 1.61

Reviewed By: yfeldblum

Differential Revision: D4100221

fbshipit-source-id: 7778b48f1bba9be85f5712f61d6e1731524901c3
parent 10191891
...@@ -15,8 +15,12 @@ ...@@ -15,8 +15,12 @@
*/ */
#pragma once #pragma once
#include <boost/context/fcontext.hpp>
#include <boost/version.hpp> #include <boost/version.hpp>
#if BOOST_VERSION >= 106100
#include <boost/context/detail/fcontext.hpp>
#else
#include <boost/context/fcontext.hpp>
#endif
#include <glog/logging.h> #include <glog/logging.h>
/** /**
...@@ -28,13 +32,17 @@ ...@@ -28,13 +32,17 @@
* http://www.boost.org/doc/libs/1_52_0/libs/context/doc/html/context/context/boost_fcontext.html * http://www.boost.org/doc/libs/1_52_0/libs/context/doc/html/context/context/boost_fcontext.html
* Boost 1.56: * Boost 1.56:
* http://www.boost.org/doc/libs/1_56_0/libs/context/doc/html/context/context/boost_fcontext.html * 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 folly {
namespace fibers { namespace fibers {
class FiberImpl { 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; using FiberContext = boost::context::fcontext_t;
#elif BOOST_VERSION >= 105200 #elif BOOST_VERSION >= 105200
using FiberContext = boost::context::fcontext_t*; using FiberContext = boost::context::fcontext_t*;
...@@ -42,7 +50,9 @@ class FiberImpl { ...@@ -42,7 +50,9 @@ class FiberImpl {
using FiberContext = boost::ctx::fcontext_t; using FiberContext = boost::ctx::fcontext_t;
#endif #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; using MainContext = boost::context::fcontext_t;
#elif BOOST_VERSION >= 105200 #elif BOOST_VERSION >= 105200
using MainContext = boost::context::fcontext_t; using MainContext = boost::context::fcontext_t;
...@@ -57,8 +67,10 @@ class FiberImpl { ...@@ -57,8 +67,10 @@ class FiberImpl {
size_t stackSize) size_t stackSize)
: func_(std::move(func)) { : func_(std::move(func)) {
auto stackBase = stackLimit + stackSize; auto stackBase = stackLimit + stackSize;
#if BOOST_VERSION >= 106100
#if BOOST_VERSION >= 105200 fiberContext_ =
boost::context::detail::make_fcontext(stackBase, stackSize, &fiberFunc);
#elif BOOST_VERSION >= 105200
fiberContext_ = fiberContext_ =
boost::context::make_fcontext(stackBase, stackSize, &fiberFunc); boost::context::make_fcontext(stackBase, stackSize, &fiberFunc);
#else #else
...@@ -69,7 +81,11 @@ class FiberImpl { ...@@ -69,7 +81,11 @@ class FiberImpl {
} }
void activate() { 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<intptr_t>(transfer.data);
#elif BOOST_VERSION >= 105200
auto context = boost::context::jump_fcontext( auto context = boost::context::jump_fcontext(
&mainContext_, fiberContext_, reinterpret_cast<intptr_t>(this)); &mainContext_, fiberContext_, reinterpret_cast<intptr_t>(this));
#else #else
...@@ -80,7 +96,11 @@ class FiberImpl { ...@@ -80,7 +96,11 @@ class FiberImpl {
} }
void deactivate() { 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<intptr_t>(transfer.data);
#elif BOOST_VERSION >= 105600
auto context = auto context =
boost::context::jump_fcontext(&fiberContext_, mainContext_, 0); boost::context::jump_fcontext(&fiberContext_, mainContext_, 0);
#elif BOOST_VERSION >= 105200 #elif BOOST_VERSION >= 105200
...@@ -93,10 +113,18 @@ class FiberImpl { ...@@ -93,10 +113,18 @@ class FiberImpl {
} }
private: private:
#if BOOST_VERSION >= 106100
static void fiberFunc(boost::context::detail::transfer_t transfer) {
auto fiberImpl = reinterpret_cast<FiberImpl*>(transfer.data);
fiberImpl->mainContext_ = transfer.fctx;
fiberImpl->func_();
}
#else
static void fiberFunc(intptr_t arg) { static void fiberFunc(intptr_t arg) {
auto fiberImpl = reinterpret_cast<FiberImpl*>(arg); auto fiberImpl = reinterpret_cast<FiberImpl*>(arg);
fiberImpl->func_(); fiberImpl->func_();
} }
#endif
folly::Function<void()> func_; folly::Function<void()> func_;
FiberContext fiberContext_; FiberContext fiberContext_;
......
...@@ -69,10 +69,16 @@ AC_DEFUN([AX_BOOST_CONTEXT], ...@@ -69,10 +69,16 @@ AC_DEFUN([AX_BOOST_CONTEXT],
CXXFLAGS_SAVE=$CXXFLAGS CXXFLAGS_SAVE=$CXXFLAGS
AC_COMPILE_IFELSE([AC_LANG_PROGRAM( AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[@%:@include <boost/context/fcontext.hpp> [[@%:@include <boost/version.hpp>
#include <boost/version.hpp> #if BOOST_VERSION >= 106100
#include <boost/context/detail/fcontext.hpp>
#else
#include <boost/context/fcontext.hpp>
#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); boost::context::fcontext_t fc = boost::context::make_fcontext(0, 0, 0);
#else #else
boost::context::fcontext_t* fc = boost::context::make_fcontext(0, 0, 0); boost::context::fcontext_t* fc = boost::context::make_fcontext(0, 0, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment