Simplify activateFiber()/deactivateFiber()
authorAndrii Grynenko <andrii@fb.com>
Mon, 31 Oct 2016 23:08:47 +0000 (16:08 -0700)
committerFacebook Github Bot <facebook-github-bot-bot@fb.com>
Mon, 31 Oct 2016 23:23:29 +0000 (16:23 -0700)
Summary: A cleanup in preparation to make folly::fibers work with newer boost.

Reviewed By: jsedgwick

Differential Revision: D4093947

fbshipit-source-id: e9a0aaeb915c40af96282169d4758afe572f2dd8

folly/fibers/Baton-inl.h
folly/fibers/Baton.cpp
folly/fibers/Fiber.cpp
folly/fibers/Fiber.h
folly/fibers/FiberManagerInternal-inl.h
folly/fibers/FiberManagerInternal.h

index adec3c5..eccc0bb 100644 (file)
@@ -51,7 +51,7 @@ void Baton::waitFiber(FiberManager& fm, F&& mainContextFunc) {
       if (LIKELY(baton_fiber == NO_WAITER)) {
         continue;
       } else if (baton_fiber == POSTED || baton_fiber == TIMEOUT) {
-        fiber.setData(0);
+        fiber.resume();
         break;
       } else {
         throw std::logic_error("Some Fiber is already waiting on this Baton.");
index bd685cf..caaaa7f 100644 (file)
@@ -151,7 +151,7 @@ void Baton::postHelper(intptr_t new_value) {
   } while (!waitingFiber_.compare_exchange_weak(fiber, new_value));
 
   if (fiber != NO_WAITER) {
-    reinterpret_cast<Fiber*>(fiber)->setData(0);
+    reinterpret_cast<Fiber*>(fiber)->resume();
   }
 }
 
index aba1d44..2c9830d 100644 (file)
@@ -50,9 +50,8 @@ static size_t nonMagicInBytes(const FContext& context) {
 
 } // anonymous namespace
 
-void Fiber::setData(intptr_t data) {
+void Fiber::resume() {
   DCHECK_EQ(state_, AWAITING);
-  data_ = data;
   state_ = READY_TO_RUN;
 
   if (fiberManager_.observer_) {
@@ -164,15 +163,11 @@ void Fiber::fiberFunc() {
 
     state_ = INVALID;
 
-    auto context = fiberManager_.deactivateFiber(this);
-
-    DCHECK_EQ(reinterpret_cast<Fiber*>(context), this);
+    fiberManager_.deactivateFiber(this);
   }
 }
 
-intptr_t Fiber::preempt(State state) {
-  intptr_t ret;
-
+void Fiber::preempt(State state) {
   auto preemptImpl = [&]() mutable {
     DCHECK_EQ(fiberManager_.activeFiber_, this);
     DCHECK_EQ(state_, RUNNING);
@@ -182,7 +177,7 @@ intptr_t Fiber::preempt(State state) {
 
     recordStackPosition();
 
-    ret = fiberManager_.deactivateFiber(this);
+    fiberManager_.deactivateFiber(this);
 
     DCHECK_EQ(fiberManager_.activeFiber_, this);
     DCHECK_EQ(state_, READY_TO_RUN);
@@ -194,8 +189,6 @@ intptr_t Fiber::preempt(State state) {
   } else {
     preemptImpl();
   }
-
-  return ret;
 }
 
 Fiber::LocalData::LocalData(const LocalData& other) : data_(nullptr) {
index 062be3b..2e50ff6 100644 (file)
@@ -45,11 +45,9 @@ class FiberManager;
 class Fiber {
  public:
   /**
-   * Sets data for the blocked task
-   *
-   * @param data this data will be returned by await() when task is resumed.
+   * Resume the blocked task
    */
-  void setData(intptr_t data);
+  void resume();
 
   Fiber(const Fiber&) = delete;
   Fiber& operator=(const Fiber&) = delete;
@@ -105,10 +103,8 @@ class Fiber {
    * performing necessary housekeeping for the new state.
    *
    * @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
@@ -118,7 +114,6 @@ class Fiber {
 
   FiberManager& fiberManager_; /**< Associated FiberManager */
   FContext fcontext_; /**< current task execution context */
-  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};
index abb7d70..6cdb5f8 100644 (file)
@@ -58,7 +58,7 @@ inline void FiberManager::ensureLoopScheduled() {
   loopController_->schedule();
 }
 
-inline intptr_t FiberManager::activateFiber(Fiber* fiber) {
+inline void FiberManager::activateFiber(Fiber* fiber) {
   DCHECK_EQ(activeFiber_, (Fiber*)nullptr);
 
 #ifdef FOLLY_SANITIZE_ADDRESS
@@ -75,10 +75,11 @@ inline intptr_t FiberManager::activateFiber(Fiber* fiber) {
 #endif
 
   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);
 
 #ifdef FOLLY_SANITIZE_ADDRESS
@@ -100,7 +101,8 @@ inline intptr_t FiberManager::deactivateFiber(Fiber* fiber) {
 #endif
 
   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) {
@@ -229,7 +231,6 @@ inline bool FiberManager::loopUntilNoReady() {
       fiber->rcontext_ = std::move(task->rcontext);
 
       fiber->setFunction(std::move(task->func));
-      fiber->data_ = reinterpret_cast<intptr_t>(fiber);
       if (observer_) {
         observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
       }
@@ -299,7 +300,6 @@ void FiberManager::addTask(F&& func) {
     fiber->setFunction(std::ref(*funcLoc));
   }
 
-  fiber->data_ = reinterpret_cast<intptr_t>(fiber);
   readyFibers_.push_back(*fiber);
   if (observer_) {
     observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
@@ -434,7 +434,6 @@ void FiberManager::addTaskFinally(F&& func, G&& finally) {
     fiber->setFunctionFinally(std::ref(*funcLoc), std::ref(*finallyLoc));
   }
 
-  fiber->data_ = reinterpret_cast<intptr_t>(fiber);
   readyFibers_.push_back(*fiber);
   if (observer_) {
     observer_->runnable(reinterpret_cast<uintptr_t>(fiber));
index 12669c7..1b8a1ed 100644 (file)
@@ -341,8 +341,8 @@ class FiberManager : public ::folly::Executor {
     AtomicIntrusiveLinkedListHook<RemoteTask> nextRemoteTask;
   };
 
-  intptr_t activateFiber(Fiber* fiber);
-  intptr_t deactivateFiber(Fiber* fiber);
+  void activateFiber(Fiber* fiber);
+  void deactivateFiber(Fiber* fiber);
 
   typedef folly::IntrusiveList<Fiber, &Fiber::listHook_> FiberTailQueue;
   typedef folly::IntrusiveList<Fiber, &Fiber::globalListHook_>