diff --git a/folly/experimental/fibers/FiberManager-inl.h b/folly/experimental/fibers/FiberManager-inl.h index 45ca472..354622c 100644 --- a/folly/experimental/fibers/FiberManager-inl.h +++ b/folly/experimental/fibers/FiberManager-inl.h @@ -97,6 +97,9 @@ inline void FiberManager::runReadyFiber(Fiber* fiber) { inline bool FiberManager::loopUntilNoReady() { SCOPE_EXIT { isLoopScheduled_ = false; + if (!readyFibers_.empty()) { + ensureLoopScheduled(); + } currentFiberManager_ = nullptr; }; @@ -135,10 +138,7 @@ inline bool FiberManager::loopUntilNoReady() { ); } - if (!yieldedFibers_.empty()) { - readyFibers_.splice(readyFibers_.end(), yieldedFibers_); - ensureLoopScheduled(); - } + readyFibers_.splice(readyFibers_.end(), yieldedFibers_); return fibersActive_ > 0; } diff --git a/folly/experimental/fibers/test/FibersTest.cpp b/folly/experimental/fibers/test/FibersTest.cpp index 681e608..bc7a738 100644 --- a/folly/experimental/fibers/test/FibersTest.cpp +++ b/folly/experimental/fibers/test/FibersTest.cpp @@ -1281,6 +1281,31 @@ TEST(FiberManager, fiberLocalHeap) { testFiberLocal(); } +TEST(FiberManager, yieldTest) { + FiberManager manager(folly::make_unique()); + auto& loopController = + dynamic_cast(manager.loopController()); + + bool checkRan = false; + + manager.addTask( + [&]() { + manager.yield(); + checkRan = true; + } + ); + + loopController.loop( + [&]() { + if (checkRan) { + loopController.stop(); + } + } + ); + + EXPECT_TRUE(checkRan); +} + static size_t sNumAwaits; void runBenchmark(size_t numAwaits, size_t toSend) {