*/
#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>
/**
* 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*;
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;
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
}
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
}
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
}
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_;
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);