Commit 9b30deab authored by Andrii Grynenko's avatar Andrii Grynenko Committed by Facebook Github Bot

Simplify activateFiber()/deactivateFiber()

Summary: A cleanup in preparation to make folly::fibers work with newer boost.

Reviewed By: jsedgwick

Differential Revision: D4093947

fbshipit-source-id: e9a0aaeb915c40af96282169d4758afe572f2dd8
parent c45de72c
...@@ -51,7 +51,7 @@ void Baton::waitFiber(FiberManager& fm, F&& mainContextFunc) { ...@@ -51,7 +51,7 @@ void Baton::waitFiber(FiberManager& fm, F&& mainContextFunc) {
if (LIKELY(baton_fiber == NO_WAITER)) { if (LIKELY(baton_fiber == NO_WAITER)) {
continue; continue;
} else if (baton_fiber == POSTED || baton_fiber == TIMEOUT) { } else if (baton_fiber == POSTED || baton_fiber == TIMEOUT) {
fiber.setData(0); fiber.resume();
break; break;
} else { } else {
throw std::logic_error("Some Fiber is already waiting on this Baton."); throw std::logic_error("Some Fiber is already waiting on this Baton.");
......
...@@ -151,7 +151,7 @@ void Baton::postHelper(intptr_t new_value) { ...@@ -151,7 +151,7 @@ void Baton::postHelper(intptr_t new_value) {
} while (!waitingFiber_.compare_exchange_weak(fiber, new_value)); } while (!waitingFiber_.compare_exchange_weak(fiber, new_value));
if (fiber != NO_WAITER) { if (fiber != NO_WAITER) {
reinterpret_cast<Fiber*>(fiber)->setData(0); reinterpret_cast<Fiber*>(fiber)->resume();
} }
} }
......
...@@ -50,9 +50,8 @@ static size_t nonMagicInBytes(const FContext& context) { ...@@ -50,9 +50,8 @@ static size_t nonMagicInBytes(const FContext& context) {
} // anonymous namespace } // anonymous namespace
void Fiber::setData(intptr_t data) { void Fiber::resume() {
DCHECK_EQ(state_, AWAITING); DCHECK_EQ(state_, AWAITING);
data_ = data;
state_ = READY_TO_RUN; state_ = READY_TO_RUN;
if (fiberManager_.observer_) { if (fiberManager_.observer_) {
...@@ -164,15 +163,11 @@ void Fiber::fiberFunc() { ...@@ -164,15 +163,11 @@ void Fiber::fiberFunc() {
state_ = INVALID; state_ = INVALID;
auto context = fiberManager_.deactivateFiber(this); fiberManager_.deactivateFiber(this);
DCHECK_EQ(reinterpret_cast<Fiber*>(context), this);
} }
} }
intptr_t Fiber::preempt(State state) { void Fiber::preempt(State state) {
intptr_t ret;
auto preemptImpl = [&]() mutable { auto preemptImpl = [&]() mutable {
DCHECK_EQ(fiberManager_.activeFiber_, this); DCHECK_EQ(fiberManager_.activeFiber_, this);
DCHECK_EQ(state_, RUNNING); DCHECK_EQ(state_, RUNNING);
...@@ -182,7 +177,7 @@ intptr_t Fiber::preempt(State state) { ...@@ -182,7 +177,7 @@ intptr_t Fiber::preempt(State state) {
recordStackPosition(); recordStackPosition();
ret = fiberManager_.deactivateFiber(this); fiberManager_.deactivateFiber(this);
DCHECK_EQ(fiberManager_.activeFiber_, this); DCHECK_EQ(fiberManager_.activeFiber_, this);
DCHECK_EQ(state_, READY_TO_RUN); DCHECK_EQ(state_, READY_TO_RUN);
...@@ -194,8 +189,6 @@ intptr_t Fiber::preempt(State state) { ...@@ -194,8 +189,6 @@ intptr_t Fiber::preempt(State state) {
} else { } else {
preemptImpl(); preemptImpl();
} }
return ret;
} }
Fiber::LocalData::LocalData(const LocalData& other) : data_(nullptr) { Fiber::LocalData::LocalData(const LocalData& other) : data_(nullptr) {
......
...@@ -45,11 +45,9 @@ class FiberManager; ...@@ -45,11 +45,9 @@ class FiberManager;
class Fiber { class Fiber {
public: public:
/** /**
* Sets data for the blocked task * Resume the blocked task
*
* @param data this data will be returned by await() when task is resumed.
*/ */
void setData(intptr_t data); void resume();
Fiber(const Fiber&) = delete; Fiber(const Fiber&) = delete;
Fiber& operator=(const Fiber&) = delete; Fiber& operator=(const Fiber&) = delete;
...@@ -105,10 +103,8 @@ class Fiber { ...@@ -105,10 +103,8 @@ class Fiber {
* performing necessary housekeeping for the new state. * performing necessary housekeeping for the new state.
* *
* @param state New state, must not be RUNNING. * @param state New state, must not be RUNNING.
*
* @return The value passed back from the main context.
*/ */
intptr_t preempt(State state); void preempt(State state);
/** /**
* Examines how much of the stack we used at this moment and * Examines how much of the stack we used at this moment and
...@@ -118,7 +114,6 @@ class Fiber { ...@@ -118,7 +114,6 @@ class Fiber {
FiberManager& fiberManager_; /**< Associated FiberManager */ FiberManager& fiberManager_; /**< Associated FiberManager */
FContext fcontext_; /**< current task execution context */ FContext fcontext_; /**< current task execution context */
intptr_t data_; /**< Used to keep some data with the Fiber */
std::shared_ptr<RequestContext> rcontext_; /**< current RequestContext */ std::shared_ptr<RequestContext> rcontext_; /**< current RequestContext */
folly::Function<void()> func_; /**< task function */ folly::Function<void()> func_; /**< task function */
bool recordStackUsed_{false}; bool recordStackUsed_{false};
......
...@@ -58,7 +58,7 @@ inline void FiberManager::ensureLoopScheduled() { ...@@ -58,7 +58,7 @@ inline void FiberManager::ensureLoopScheduled() {
loopController_->schedule(); loopController_->schedule();
} }
inline intptr_t FiberManager::activateFiber(Fiber* fiber) { inline void FiberManager::activateFiber(Fiber* fiber) {
DCHECK_EQ(activeFiber_, (Fiber*)nullptr); DCHECK_EQ(activeFiber_, (Fiber*)nullptr);
#ifdef FOLLY_SANITIZE_ADDRESS #ifdef FOLLY_SANITIZE_ADDRESS
...@@ -75,10 +75,11 @@ inline intptr_t FiberManager::activateFiber(Fiber* fiber) { ...@@ -75,10 +75,11 @@ inline intptr_t FiberManager::activateFiber(Fiber* fiber) {
#endif #endif
activeFiber_ = fiber; activeFiber_ = fiber;
return jumpContext(&mainContext_, &fiber->fcontext_, fiber->data_); jumpContext(
&mainContext_, &fiber->fcontext_, reinterpret_cast<intptr_t>(fiber));
} }
inline intptr_t FiberManager::deactivateFiber(Fiber* fiber) { inline void FiberManager::deactivateFiber(Fiber* fiber) {
DCHECK_EQ(activeFiber_, fiber); DCHECK_EQ(activeFiber_, fiber);
#ifdef FOLLY_SANITIZE_ADDRESS #ifdef FOLLY_SANITIZE_ADDRESS
...@@ -100,7 +101,8 @@ inline intptr_t FiberManager::deactivateFiber(Fiber* fiber) { ...@@ -100,7 +101,8 @@ inline intptr_t FiberManager::deactivateFiber(Fiber* fiber) {
#endif #endif
activeFiber_ = nullptr; activeFiber_ = nullptr;
return jumpContext(&fiber->fcontext_, &mainContext_, 0); auto context = jumpContext(&fiber->fcontext_, &mainContext_, 0);
DCHECK_EQ(fiber, reinterpret_cast<Fiber*>(context));
} }
inline void FiberManager::runReadyFiber(Fiber* fiber) { inline void FiberManager::runReadyFiber(Fiber* fiber) {
...@@ -229,7 +231,6 @@ inline bool FiberManager::loopUntilNoReady() { ...@@ -229,7 +231,6 @@ inline bool FiberManager::loopUntilNoReady() {
fiber->rcontext_ = std::move(task->rcontext); fiber->rcontext_ = std::move(task->rcontext);
fiber->setFunction(std::move(task->func)); fiber->setFunction(std::move(task->func));
fiber->data_ = reinterpret_cast<intptr_t>(fiber);
if (observer_) { if (observer_) {
observer_->runnable(reinterpret_cast<uintptr_t>(fiber)); observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
} }
...@@ -299,7 +300,6 @@ void FiberManager::addTask(F&& func) { ...@@ -299,7 +300,6 @@ void FiberManager::addTask(F&& func) {
fiber->setFunction(std::ref(*funcLoc)); fiber->setFunction(std::ref(*funcLoc));
} }
fiber->data_ = reinterpret_cast<intptr_t>(fiber);
readyFibers_.push_back(*fiber); readyFibers_.push_back(*fiber);
if (observer_) { if (observer_) {
observer_->runnable(reinterpret_cast<uintptr_t>(fiber)); observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
...@@ -434,7 +434,6 @@ void FiberManager::addTaskFinally(F&& func, G&& finally) { ...@@ -434,7 +434,6 @@ void FiberManager::addTaskFinally(F&& func, G&& finally) {
fiber->setFunctionFinally(std::ref(*funcLoc), std::ref(*finallyLoc)); fiber->setFunctionFinally(std::ref(*funcLoc), std::ref(*finallyLoc));
} }
fiber->data_ = reinterpret_cast<intptr_t>(fiber);
readyFibers_.push_back(*fiber); readyFibers_.push_back(*fiber);
if (observer_) { if (observer_) {
observer_->runnable(reinterpret_cast<uintptr_t>(fiber)); observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
......
...@@ -341,8 +341,8 @@ class FiberManager : public ::folly::Executor { ...@@ -341,8 +341,8 @@ class FiberManager : public ::folly::Executor {
AtomicIntrusiveLinkedListHook<RemoteTask> nextRemoteTask; AtomicIntrusiveLinkedListHook<RemoteTask> nextRemoteTask;
}; };
intptr_t activateFiber(Fiber* fiber); void activateFiber(Fiber* fiber);
intptr_t deactivateFiber(Fiber* fiber); void deactivateFiber(Fiber* fiber);
typedef folly::IntrusiveList<Fiber, &Fiber::listHook_> FiberTailQueue; typedef folly::IntrusiveList<Fiber, &Fiber::listHook_> FiberTailQueue;
typedef folly::IntrusiveList<Fiber, &Fiber::globalListHook_> typedef folly::IntrusiveList<Fiber, &Fiber::globalListHook_>
......
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