Support nested FiberManagers
[folly.git] / folly / experimental / fibers / FiberManager-inl.h
index b0a6334e457d56a268073fafaefc0eec915a91f1..61d4fec0badf8e124ecbb613c628f5ed8a2eb0f7 100644 (file)
@@ -141,16 +141,19 @@ inline void FiberManager::runReadyFiber(Fiber* fiber) {
 }
 
 inline bool FiberManager::loopUntilNoReady() {
+  // Support nested FiberManagers
+  auto originalFiberManager = this;
+  std::swap(currentFiberManager_, originalFiberManager);
+
   SCOPE_EXIT {
     isLoopScheduled_ = false;
     if (!readyFibers_.empty()) {
       ensureLoopScheduled();
     }
-    currentFiberManager_ = nullptr;
+    std::swap(currentFiberManager_, originalFiberManager);
+    CHECK_EQ(this, originalFiberManager);
   };
 
-  currentFiberManager_ = this;
-
   bool hadRemoteFiber = true;
   while (hadRemoteFiber) {
     hadRemoteFiber = false;