*/
#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
+
/**
* Wrappers for different versions of boost::context library
* API reference for different versions
struct FContext {
public:
-#if BOOST_VERSION >= 105200
+#if BOOST_VERSION >= 106100
+ using ContextStruct = boost::context::detail::fcontext_t;
+#elif BOOST_VERSION >= 105200
using ContextStruct = boost::context::fcontext_t;
#else
using ContextStruct = boost::ctx::fcontext_t;
#endif
+#if BOOST_VERSION >= 106100
+ using FiberArg = boost::context::detail::transfer_t;
+ using FiberData = void*;
+ static void* getFiber(FiberArg arg) {
+ return arg.fctx;
+ }
+#else
+ using FiberArg = intptr_t;
+ using FiberData = intptr_t;
+ static FiberArg getFiber(FiberArg arg) {
+ return arg;
+ }
+#endif
+
void* stackLimit() const {
return stackLimit_;
}
ContextStruct context_;
#endif
- friend intptr_t
- jumpContext(FContext* oldC, FContext::ContextStruct* newC, intptr_t p);
- friend intptr_t
- jumpContext(FContext::ContextStruct* oldC, FContext* newC, intptr_t p);
+ friend FiberData
+ jumpContext(FContext* oldC, FContext::ContextStruct* newC, FiberData p);
+ friend FiberData
+ jumpContext(FContext::ContextStruct* oldC, FContext* newC, FiberData p);
friend FContext
- makeContext(void* stackLimit, size_t stackSize, void (*fn)(intptr_t));
+ makeContext(void* stackLimit, size_t stackSize, void (*fn)(FiberArg));
};
-inline intptr_t
-jumpContext(FContext* oldC, FContext::ContextStruct* newC, intptr_t p) {
-#if BOOST_VERSION >= 105600
+inline FContext::FiberData jumpContext(
+ FContext* oldC,
+ FContext::ContextStruct* newC,
+ FContext::FiberData p) {
+#if BOOST_VERSION >= 106100
+ boost::context::detail::transfer_t result =
+ boost::context::detail::jump_fcontext(*newC, p);
+ oldC->context_ = result.fctx;
+ return result.data;
+#elif BOOST_VERSION >= 105600
return boost::context::jump_fcontext(&oldC->context_, *newC, p);
#elif BOOST_VERSION >= 105200
return boost::context::jump_fcontext(oldC->context_, newC, p);
#endif
}
-inline intptr_t
-jumpContext(FContext::ContextStruct* oldC, FContext* newC, intptr_t p) {
-#if BOOST_VERSION >= 105200
+inline FContext::FiberData jumpContext(
+ FContext::ContextStruct* oldC,
+ FContext* newC,
+ FContext::FiberData p) {
+#if BOOST_VERSION >= 106100
+ boost::context::detail::transfer_t result =
+ boost::context::detail::jump_fcontext(newC->context_, p);
+ *oldC = result.fctx;
+ return result.data;
+#elif BOOST_VERSION >= 105200
return boost::context::jump_fcontext(oldC, newC->context_, p);
#else
return jump_fcontext(oldC, &newC->context_, p);
#endif
}
-inline FContext
-makeContext(void* stackLimit, size_t stackSize, void (*fn)(intptr_t)) {
+inline FContext makeContext(
+ void* stackLimit,
+ size_t stackSize,
+ void (*fn)(FContext::FiberArg)) {
FContext res;
res.stackLimit_ = stackLimit;
res.stackBase_ = static_cast<unsigned char*>(stackLimit) + stackSize;
-#if BOOST_VERSION >= 105200
+#if BOOST_VERSION >= 106100
+ res.context_ =
+ boost::context::detail::make_fcontext(res.stackBase_, stackSize, fn);
+#elif BOOST_VERSION >= 105200
res.context_ = boost::context::make_fcontext(res.stackBase_, stackSize, fn);
#else
res.context_.fc_stack.limit = stackLimit;
} // anonymous namespace
-void Fiber::setData(intptr_t data) {
+void Fiber::setData(FContext::FiberData data) {
DCHECK_EQ(state_, AWAITING);
data_ = data;
state_ = READY_TO_RUN;
VLOG(4) << "Stack usage: " << currentPosition;
}
-void Fiber::fiberFuncHelper(intptr_t fiber) {
- reinterpret_cast<Fiber*>(fiber)->fiberFunc();
+void Fiber::fiberFuncHelper(FContext::FiberArg fiber) {
+ reinterpret_cast<Fiber*>(FContext::getFiber(fiber))->fiberFunc();
}
void Fiber::fiberFunc() {
}
}
-intptr_t Fiber::preempt(State state) {
- intptr_t ret;
+FContext::FiberData Fiber::preempt(State state) {
+ FContext::FiberData ret;
auto preemptImpl = [&]() mutable {
DCHECK_EQ(fiberManager_.activeFiber_, this);
*
* @param data this data will be returned by await() when task is resumed.
*/
- void setData(intptr_t data);
+ void setData(FContext::FiberData data);
Fiber(const Fiber&) = delete;
Fiber& operator=(const Fiber&) = delete;
template <typename F, typename G>
void setFunctionFinally(F&& func, G&& finally);
- static void fiberFuncHelper(intptr_t fiber);
+ static void fiberFuncHelper(FContext::FiberArg fiber);
void fiberFunc();
/**
*
* @return The value passed back from the main context.
*/
- intptr_t preempt(State state);
+ FContext::FiberData preempt(State state);
/**
* Examines how much of the stack we used at this moment and
FiberManager& fiberManager_; /**< Associated FiberManager */
FContext fcontext_; /**< current task execution context */
- intptr_t data_; /**< Used to keep some data with the Fiber */
+ FContext::FiberData data_; /**< Used to keep some data with the Fiber */
std::shared_ptr<RequestContext> rcontext_; /**< current RequestContext */
folly::Function<void()> func_; /**< task function */
bool recordStackUsed_{false};
loopController_->schedule();
}
-inline intptr_t FiberManager::activateFiber(Fiber* fiber) {
+inline FContext::FiberData FiberManager::activateFiber(Fiber* fiber) {
DCHECK_EQ(activeFiber_, (Fiber*)nullptr);
#ifdef FOLLY_SANITIZE_ADDRESS
return jumpContext(&mainContext_, &fiber->fcontext_, fiber->data_);
}
-inline intptr_t FiberManager::deactivateFiber(Fiber* fiber) {
+inline FContext::FiberData FiberManager::deactivateFiber(Fiber* fiber) {
DCHECK_EQ(activeFiber_, fiber);
#ifdef FOLLY_SANITIZE_ADDRESS
fiber->rcontext_ = std::move(task->rcontext);
fiber->setFunction(std::move(task->func));
- fiber->data_ = reinterpret_cast<intptr_t>(fiber);
+ fiber->data_ = reinterpret_cast<FContext::FiberData>(fiber);
if (observer_) {
observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
}
fiber->setFunction(std::ref(*funcLoc));
}
- fiber->data_ = reinterpret_cast<intptr_t>(fiber);
+ fiber->data_ = reinterpret_cast<FContext::FiberData>(fiber);
readyFibers_.push_back(*fiber);
if (observer_) {
observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
fiber->setFunctionFinally(std::ref(*funcLoc), std::ref(*finallyLoc));
}
- fiber->data_ = reinterpret_cast<intptr_t>(fiber);
+ fiber->data_ = reinterpret_cast<FContext::FiberData>(fiber);
readyFibers_.push_back(*fiber);
if (observer_) {
observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
AtomicIntrusiveLinkedListHook<RemoteTask> nextRemoteTask;
};
- intptr_t activateFiber(Fiber* fiber);
- intptr_t deactivateFiber(Fiber* fiber);
+ FContext::FiberData activateFiber(Fiber* fiber);
+ FContext::FiberData deactivateFiber(Fiber* fiber);
typedef folly::IntrusiveList<Fiber, &Fiber::listHook_> FiberTailQueue;
typedef folly::IntrusiveList<Fiber, &Fiber::globalListHook_>
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);