From: Andrii Grynenko <andrii@fb.com>
Date: Tue, 1 Nov 2016 01:16:50 +0000 (-0700)
Subject: Fix BoostContextCompatibility for boost >= 1.61
X-Git-Tag: v2016.11.07.00~21
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=823ecf8917d7f0534ed02b8d38bfc966cb0fd7b6;p=folly.git

Fix BoostContextCompatibility for boost >= 1.61

Reviewed By: yfeldblum

Differential Revision: D4100221

fbshipit-source-id: 7778b48f1bba9be85f5712f61d6e1731524901c3
---

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 <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_;
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 <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);