Commit fe583120 authored by Stepan Palamarchuk's avatar Stepan Palamarchuk Committed by Facebook Github Bot 6

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
parent 74b54130
......@@ -120,6 +120,9 @@ Fiber* FiberManager::getFiber() {
maxFibersActiveLastPeriod_ = fibersActive_;
}
++fiberId_;
bool recordStack = (options_.recordStackEvery != 0) &&
(fiberId_ % options_.recordStackEvery == 0);
fiber->init(recordStack);
return fiber;
}
......
......@@ -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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment