Periodically reclaim unnecessary fibers from free pool
[folly.git] / folly / experimental / fibers / FiberManager.h
index 80ebd543cb2d4bc305eefafaa4a956ac74077362..0a74500f6cf9185213f4dde0579b201b8033bd5a 100644 (file)
@@ -34,6 +34,7 @@
 #include <folly/experimental/fibers/BoostContextCompatibility.h>
 #include <folly/experimental/fibers/Fiber.h>
 #include <folly/experimental/fibers/GuardPageAllocator.h>
+#include <folly/experimental/fibers/TimeoutController.h>
 #include <folly/experimental/fibers/traits.h>
 
 namespace folly { namespace fibers {
@@ -89,6 +90,13 @@ class FiberManager : public ::folly::Executor {
      */
     bool useGuardPages{false};
 
+    /**
+     * Free unnecessary fibers in the fibers pool every fibersPoolResizePeriodMs
+     * milliseconds. If value is 0, periodic resizing of the fibers pool is
+     * disabled.
+     */
+    uint32_t fibersPoolResizePeriodMs{0};
+
     constexpr Options() {}
   };
 
@@ -306,6 +314,12 @@ class FiberManager : public ::folly::Executor {
   size_t fibersActive_{0};      /**< number of running or blocked fibers */
   size_t fiberId_{0};           /**< id of last fiber used */
 
+  /**
+   * Maximum number of active fibers in the last period lasting
+   * Options::fibersPoolResizePeriod milliseconds.
+   */
+  size_t maxFibersActiveLastPeriod_{0};
+
   FContext::ContextStruct mainContext_;  /**< stores loop function context */
 
   std::unique_ptr<LoopController> loopController_;
@@ -387,6 +401,19 @@ class FiberManager : public ::folly::Executor {
 
   std::shared_ptr<TimeoutController> timeoutManager_;
 
+  struct FibersPoolResizer {
+    explicit FibersPoolResizer(FiberManager& fm) :
+      fiberManager_(fm) {}
+    void operator()();
+   private:
+    FiberManager& fiberManager_;
+  };
+
+  FibersPoolResizer fibersPoolResizer_;
+  bool fibersPoolResizerScheduled_{false};
+
+  void doFibersPoolResizing();
+
   /**
    * Only local of this type will be available for fibers.
    */