*/
#pragma once
-#include <boost/version.hpp>
-
-#if BOOST_VERSION >= 106100
-#include <boost/context/detail/fcontext.hpp>
-#else
#include <boost/context/fcontext.hpp>
-#endif
+#include <boost/version.hpp>
/**
* Wrappers for different versions of boost::context library
struct FContext {
public:
-#if BOOST_VERSION >= 106100
- using ContextStruct = boost::context::detail::fcontext_t;
-#elif BOOST_VERSION >= 105200
+#if 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 FiberData
- jumpContext(FContext* oldC, FContext::ContextStruct* newC, FiberData p);
- friend FiberData
- jumpContext(FContext::ContextStruct* oldC, FContext* newC, FiberData p);
+ 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 FContext
- makeContext(void* stackLimit, size_t stackSize, void (*fn)(FiberArg));
+ makeContext(void* stackLimit, size_t stackSize, void (*fn)(intptr_t));
};
-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
+inline intptr_t
+jumpContext(FContext* oldC, FContext::ContextStruct* newC, intptr_t p) {
+#if 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 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
+inline intptr_t
+jumpContext(FContext::ContextStruct* oldC, FContext* newC, intptr_t p) {
+#if 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)(FContext::FiberArg)) {
+inline FContext
+makeContext(void* stackLimit, size_t stackSize, void (*fn)(intptr_t)) {
FContext res;
res.stackLimit_ = stackLimit;
res.stackBase_ = static_cast<unsigned char*>(stackLimit) + stackSize;
-#if BOOST_VERSION >= 106100
- res.context_ =
- boost::context::detail::make_fcontext(res.stackBase_, stackSize, fn);
-#elif BOOST_VERSION >= 105200
+#if 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(FContext::FiberData data) {
+void Fiber::setData(intptr_t data) {
DCHECK_EQ(state_, AWAITING);
data_ = data;
state_ = READY_TO_RUN;
VLOG(4) << "Stack usage: " << currentPosition;
}
-void Fiber::fiberFuncHelper(FContext::FiberArg fiber) {
- reinterpret_cast<Fiber*>(FContext::getFiber(fiber))->fiberFunc();
+void Fiber::fiberFuncHelper(intptr_t fiber) {
+ reinterpret_cast<Fiber*>(fiber)->fiberFunc();
}
void Fiber::fiberFunc() {
}
}
-FContext::FiberData Fiber::preempt(State state) {
- FContext::FiberData ret;
+intptr_t Fiber::preempt(State state) {
+ intptr_t ret;
auto preemptImpl = [&]() mutable {
DCHECK_EQ(fiberManager_.activeFiber_, this);
*
* @param data this data will be returned by await() when task is resumed.
*/
- void setData(FContext::FiberData data);
+ void setData(intptr_t data);
Fiber(const Fiber&) = delete;
Fiber& operator=(const Fiber&) = delete;
template <typename F, typename G>
void setFunctionFinally(F&& func, G&& finally);
- static void fiberFuncHelper(FContext::FiberArg fiber);
+ static void fiberFuncHelper(intptr_t fiber);
void fiberFunc();
/**
*
* @return The value passed back from the main context.
*/
- FContext::FiberData preempt(State state);
+ intptr_t 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 */
- FContext::FiberData data_; /**< Used to keep some data with the Fiber */
+ intptr_t 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 FContext::FiberData FiberManager::activateFiber(Fiber* fiber) {
+inline intptr_t FiberManager::activateFiber(Fiber* fiber) {
DCHECK_EQ(activeFiber_, (Fiber*)nullptr);
#ifdef FOLLY_SANITIZE_ADDRESS
return jumpContext(&mainContext_, &fiber->fcontext_, fiber->data_);
}
-inline FContext::FiberData FiberManager::deactivateFiber(Fiber* fiber) {
+inline intptr_t 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<FContext::FiberData>(fiber);
+ fiber->data_ = reinterpret_cast<intptr_t>(fiber);
if (observer_) {
observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
}
fiber->setFunction(std::ref(*funcLoc));
}
- fiber->data_ = reinterpret_cast<FContext::FiberData>(fiber);
+ fiber->data_ = reinterpret_cast<intptr_t>(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<FContext::FiberData>(fiber);
+ fiber->data_ = reinterpret_cast<intptr_t>(fiber);
readyFibers_.push_back(*fiber);
if (observer_) {
observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
AtomicIntrusiveLinkedListHook<RemoteTask> nextRemoteTask;
};
- FContext::FiberData activateFiber(Fiber* fiber);
- FContext::FiberData deactivateFiber(Fiber* fiber);
+ intptr_t activateFiber(Fiber* fiber);
+ intptr_t 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/version.hpp>
-#if BOOST_VERSION >= 106100
-# include <boost/context/detail/fcontext.hpp>
-#else
-# include <boost/context/fcontext.hpp>
-#endif
+ [[@%:@include <boost/context/fcontext.hpp>
+#include <boost/version.hpp>
]],
- [[#if BOOST_VERSION >= 106100
- boost::context::detail::fcontext_t fc =
- boost::context::detail::make_fcontext(0, 0, 0);
-#elif BOOST_VERSION >= 105600
+ [[#if 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);