Commit d1f8e411 authored by Dan Melnic's avatar Dan Melnic Committed by Facebook GitHub Bot

Avoid calling scheduleTimeout for a thread that is mostly busy

Summary: Avoid calling scheduleTimeout for a thread that is mostly busy

Reviewed By: yfeldblum

Differential Revision: D21531280

fbshipit-source-id: b89254ebc3662c951b3b181b3a2777afb9e3f4fe
parent ee1e6c7b
...@@ -38,24 +38,33 @@ class MemoryIdlerTimeout : public AsyncTimeout, public EventBase::LoopCallback { ...@@ -38,24 +38,33 @@ class MemoryIdlerTimeout : public AsyncTimeout, public EventBase::LoopCallback {
explicit MemoryIdlerTimeout(EventBase* b) : AsyncTimeout(b), base_(b) {} explicit MemoryIdlerTimeout(EventBase* b) : AsyncTimeout(b), base_(b) {}
void timeoutExpired() noexcept override { void timeoutExpired() noexcept override {
idled = true; idled_ = true;
timerRunning_ = false;
} }
void runLoopCallback() noexcept override { void runLoopCallback() noexcept override {
if (idled) { if (idled_) {
MemoryIdler::flushLocalMallocCaches(); if (num_ == 0) {
MemoryIdler::unmapUnusedStack(MemoryIdler::kDefaultStackToRetain); MemoryIdler::flushLocalMallocCaches();
MemoryIdler::unmapUnusedStack(MemoryIdler::kDefaultStackToRetain);
idled = false; }
idled_ = false;
num_ = 0;
} else { } else {
std::chrono::steady_clock::duration idleTimeout = if (!timerRunning_) {
MemoryIdler::defaultIdleTimeout.load(std::memory_order_acquire); timerRunning_ = true;
std::chrono::steady_clock::duration idleTimeout =
idleTimeout = MemoryIdler::getVariationTimeout(idleTimeout); MemoryIdler::defaultIdleTimeout.load(std::memory_order_acquire);
scheduleTimeout(static_cast<uint32_t>( idleTimeout = MemoryIdler::getVariationTimeout(idleTimeout);
std::chrono::duration_cast<std::chrono::milliseconds>(idleTimeout)
.count())); scheduleTimeout(static_cast<uint32_t>(
std::chrono::duration_cast<std::chrono::milliseconds>(idleTimeout)
.count()));
} else {
num_++;
}
} }
// reschedule this callback for the next event loop. // reschedule this callback for the next event loop.
...@@ -64,7 +73,9 @@ class MemoryIdlerTimeout : public AsyncTimeout, public EventBase::LoopCallback { ...@@ -64,7 +73,9 @@ class MemoryIdlerTimeout : public AsyncTimeout, public EventBase::LoopCallback {
private: private:
EventBase* base_; EventBase* base_;
bool idled{false}; bool idled_{false};
bool timerRunning_{false};
size_t num_{0};
}; };
IOThreadPoolExecutor::IOThreadPoolExecutor( IOThreadPoolExecutor::IOThreadPoolExecutor(
......
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