From fe5831207fbe073b22c2b6bd9ed66f62d568eb2c Mon Sep 17 00:00:00 2001 From: Stepan Palamarchuk Date: Mon, 12 Sep 2016 19:49:22 -0700 Subject: [PATCH] Fix recordStack feature in FiberManager Summary: It appears that a feature of recording exact stack usage on fibers is broken for a long time. This diff brings it back. Reviewed By: andriigrynenko Differential Revision: D3847035 fbshipit-source-id: d9cf532774204b6ac2f40e1b39fd98ea06c08f55 --- folly/fibers/FiberManager.cpp | 3 +++ folly/fibers/test/FibersTest.cpp | 38 ++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/folly/fibers/FiberManager.cpp b/folly/fibers/FiberManager.cpp index 6528ca53..d900bcff 100644 --- a/folly/fibers/FiberManager.cpp +++ b/folly/fibers/FiberManager.cpp @@ -120,6 +120,9 @@ Fiber* FiberManager::getFiber() { maxFibersActiveLastPeriod_ = fibersActive_; } ++fiberId_; + bool recordStack = (options_.recordStackEvery != 0) && + (fiberId_ % options_.recordStackEvery == 0); + fiber->init(recordStack); return fiber; } diff --git a/folly/fibers/test/FibersTest.cpp b/folly/fibers/test/FibersTest.cpp index 2a05fd4b..e0c5424b 100644 --- a/folly/fibers/test/FibersTest.cpp +++ b/folly/fibers/test/FibersTest.cpp @@ -1594,3 +1594,41 @@ TEST(FiberManager, semaphore) { EXPECT_GE(counterA, 0); EXPECT_GE(counterB, 0); } + +/** + * Test that we can properly track fiber stack usage. + * + * This functionality can only be enabled when ASAN is disabled, so avoid + * running this test with ASAN. + */ +#ifndef FOLLY_SANITIZE_ADDRESS +TEST(FiberManager, recordStack) { + std::thread([] { + folly::fibers::FiberManager::Options opts; + opts.recordStackEvery = 1; + + FiberManager fm(folly::make_unique(), opts); + auto& loopController = + dynamic_cast(fm.loopController()); + + constexpr size_t n = 1000; + int s = 0; + fm.addTask([&]() { + int b[n] = {0}; + for (size_t i = 0; i < n; ++i) { + b[i] = i; + } + for (size_t i = 0; i + 1 < n; ++i) { + s += b[i] * b[i + 1]; + } + }); + + (void)s; + + loopController.loop([&]() { loopController.stop(); }); + + // Check that we properly accounted fiber stack usage. + EXPECT_LT(n * sizeof(int), fm.stackHighWatermark()); + }).join(); +} +#endif -- 2.34.1