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 @@
*/
#pragma once
#include <boost/context/fcontext.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>
/**
......@@ -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<intptr_t>(transfer.data);
#elif BOOST_VERSION >= 105200
auto context = boost::context::jump_fcontext(
&mainContext_, fiberContext_, reinterpret_cast<intptr_t>(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<intptr_t>(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<FiberImpl*>(transfer.data);
fiberImpl->mainContext_ = transfer.fctx;
fiberImpl->func_();
}
#else
static void fiberFunc(intptr_t arg) {
auto fiberImpl = reinterpret_cast<FiberImpl*>(arg);
fiberImpl->func_();
}
#endif
folly::Function<void()> func_;
FiberContext fiberContext_;
......
......@@ -69,10 +69,16 @@ AC_DEFUN([AX_BOOST_CONTEXT],
CXXFLAGS_SAVE=$CXXFLAGS
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);
#else
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