Support custom loop runner for EventBaseLoopController
authorAndrii Grynenko <andrii@fb.com>
Tue, 26 Jul 2016 21:45:42 +0000 (14:45 -0700)
committerFacebook Github Bot 3 <facebook-github-bot-3-bot@fb.com>
Tue, 26 Jul 2016 21:53:27 +0000 (14:53 -0700)
Summary: This allows having some logic executed before and after FiberManager loop (e.g. grabbing a Python GIL).

Reviewed By: A5he

Differential Revision: D3616752

fbshipit-source-id: 3be35d54ced458328816d583133457a44a863acd

folly/fibers/EventBaseLoopController-inl.h
folly/fibers/EventBaseLoopController.h

index c9109c993f52d6ae4ddadf01458b3ff7c1e9ba08..0e4c2fd7d5c8e8b131a68dd37a2163e99c0316ce 100644 (file)
@@ -15,7 +15,6 @@
  */
 #include <folly/Memory.h>
 #include <folly/fibers/EventBaseLoopController.h>
-#include <folly/fibers/FiberManager.h>
 
 namespace folly {
 namespace fibers {
@@ -63,7 +62,11 @@ inline void EventBaseLoopController::cancel() {
 }
 
 inline void EventBaseLoopController::runLoop() {
-  fm_->loopUntilNoReady();
+  if (loopRunner_) {
+    loopRunner_->run([&] { fm_->loopUntilNoReady(); });
+  } else {
+    fm_->loopUntilNoReady();
+  }
 }
 
 inline void EventBaseLoopController::scheduleThreadSafe(
index 4d4ca9984b35f14645eaeca2a7539e086689064a..f1c41287d8974836f337ef463be3639adf41f8e4 100644 (file)
@@ -15,6 +15,7 @@
  */
 #pragma once
 
+#include <folly/fibers/FiberManager.h>
 #include <folly/fibers/LoopController.h>
 #include <folly/io/async/EventBase.h>
 #include <atomic>
@@ -27,8 +28,6 @@ class EventBase;
 namespace folly {
 namespace fibers {
 
-class FiberManager;
-
 class EventBaseLoopController : public LoopController {
  public:
   explicit EventBaseLoopController();
@@ -43,6 +42,10 @@ class EventBaseLoopController : public LoopController {
     return eventBase_;
   }
 
+  void setLoopRunner(InlineFunctionRunner* loopRunner) {
+    loopRunner_ = loopRunner;
+  }
+
  private:
   class ControllerCallback : public folly::EventBase::LoopCallback {
    public:
@@ -93,6 +96,7 @@ class EventBaseLoopController : public LoopController {
   FiberManager* fm_{nullptr};
   std::atomic<bool> eventBaseAttached_{false};
   std::weak_ptr<void> aliveWeak_;
+  InlineFunctionRunner* loopRunner_{nullptr};
 
   /* LoopController interface */