Fix recordStack feature in FiberManager
authorStepan Palamarchuk <stepan@fb.com>
Tue, 13 Sep 2016 02:49:22 +0000 (19:49 -0700)
committerFacebook Github Bot 6 <facebook-github-bot-6-bot@fb.com>
Tue, 13 Sep 2016 02:53:30 +0000 (19:53 -0700)
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
folly/fibers/test/FibersTest.cpp

index 6528ca5..d900bcf 100644 (file)
@@ -120,6 +120,9 @@ Fiber* FiberManager::getFiber() {
     maxFibersActiveLastPeriod_ = fibersActive_;
   }
   ++fiberId_;
+  bool recordStack = (options_.recordStackEvery != 0) &&
+      (fiberId_ % options_.recordStackEvery == 0);
+  fiber->init(recordStack);
   return fiber;
 }
 
index 2a05fd4..e0c5424 100644 (file)
@@ -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<SimpleLoopController>(), opts);
+    auto& loopController =
+        dynamic_cast<SimpleLoopController&>(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