RCU
[folly.git] / folly / fibers / FiberManagerInternal.h
index ea379c678bac1383997b6161c4355d8844621975..508967c5c34760d58febdf99be43faebdd4b0747 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
 #include <vector>
 
 #include <folly/AtomicIntrusiveLinkedList.h>
+#include <folly/CPortability.h>
 #include <folly/Executor.h>
 #include <folly/IntrusiveList.h>
 #include <folly/Likely.h>
@@ -145,7 +146,7 @@ class FiberManager : public ::folly::Executor {
       std::unique_ptr<LoopController> loopController,
       Options options = Options());
 
-  ~FiberManager();
+  ~FiberManager() override;
 
   /**
    * Controller access.
@@ -155,10 +156,13 @@ class FiberManager : public ::folly::Executor {
 
   /**
    * Keeps running ready tasks until the list of ready tasks is empty.
-   *
-   * @return True if there are any waiting tasks remaining.
    */
-  bool loopUntilNoReady();
+  void loopUntilNoReady();
+
+  /**
+   * This should only be called by a LoopController.
+   */
+  void loopUntilNoReadyImpl();
 
   /**
    * @return true if there are outstanding tasks.
@@ -250,7 +254,7 @@ class FiberManager : public ::folly::Executor {
   T& local();
 
   template <typename T>
-  static T& localThread();
+  FOLLY_EXPORT static T& localThread();
 
   /**
    * @return How many fiber objects (and stacks) has this manager allocated.
@@ -333,7 +337,7 @@ class FiberManager : public ::folly::Executor {
     template <typename F>
     RemoteTask(F&& f, const Fiber::LocalData& localData_)
         : func(std::forward<F>(f)),
-          localData(folly::make_unique<Fiber::LocalData>(localData_)),
+          localData(std::make_unique<Fiber::LocalData>(localData_)),
           rcontext(RequestContext::saveContext()) {}
     folly::Function<void()> func;
     std::unique_ptr<Fiber::LocalData> localData;
@@ -341,8 +345,8 @@ class FiberManager : public ::folly::Executor {
     AtomicIntrusiveLinkedListHook<RemoteTask> nextRemoteTask;
   };
 
-  FContext::FiberData activateFiber(Fiber* fiber);
-  FContext::FiberData deactivateFiber(Fiber* fiber);
+  void activateFiber(Fiber* fiber);
+  void deactivateFiber(Fiber* fiber);
 
   typedef folly::IntrusiveList<Fiber, &Fiber::listHook_> FiberTailQueue;
   typedef folly::IntrusiveList<Fiber, &Fiber::globalListHook_>
@@ -358,7 +362,7 @@ class FiberManager : public ::folly::Executor {
   FiberTailQueue readyFibers_; /**< queue of fibers ready to be executed */
   FiberTailQueue yieldedFibers_; /**< queue of fibers which have yielded
                                       execution */
-  FiberTailQueue fibersPool_; /**< pool of unitialized Fiber objects */
+  FiberTailQueue fibersPool_; /**< pool of uninitialized Fiber objects */
 
   GlobalFiberTailQueue allFibers_; /**< list of all Fiber objects owned */
 
@@ -373,8 +377,6 @@ class FiberManager : public ::folly::Executor {
    */
   size_t maxFibersActiveLastPeriod_{0};
 
-  FContext::ContextStruct mainContext_; /**< stores loop function context */
-
   std::unique_ptr<LoopController> loopController_;
   bool isLoopScheduled_{false}; /**< was the ready loop scheduled to run? */
 
@@ -476,6 +478,7 @@ class FiberManager : public ::folly::Executor {
       void* fakeStack,
       const void** saveStackBase,
       size_t* saveStackSize);
+  void freeFakeStack(void* fakeStack);
   void unpoisonFiberStack(const Fiber* fiber);
 
 #endif // FOLLY_SANITIZE_ADDRESS
@@ -573,7 +576,7 @@ inline void yield() {
     std::this_thread::yield();
   }
 }
-}
-}
+} // namespace fibers
+} // namespace folly
 
 #include <folly/fibers/FiberManagerInternal-inl.h>