Commit 750d49c8 authored by Chad Parry's avatar Chad Parry Committed by facebook-github-bot-0

Avoid cost of cancelAll

Summary:
This is an experimental diff that may improve the performance of `HHWheelTimer::cancelAll`. If there are no timers to cancel, then it can bail early.

Since perflab is unlikely to be conclusive, and since this diff looks like a strict improvement, I'll proceed with landing it.

Reviewed By: djwatson

Differential Revision: D2735297

fb-gh-sync-id: 9f5a811ee6d9fa9434576e9abd3ef3443a7579b7
parent 5ff51e97
......@@ -218,30 +218,32 @@ void HHWheelTimer::timeoutExpired() noexcept {
}
size_t HHWheelTimer::cancelAll() {
decltype(buckets_) buckets;
size_t count = 0;
if (count_ != 0) {
decltype(buckets_) buckets;
// Work around std::swap() bug in libc++
//
// http://llvm.org/bugs/show_bug.cgi?id=22106
#if FOLLY_USE_LIBCPP
for (size_t i = 0; i < WHEEL_BUCKETS; ++i) {
for (size_t ii = 0; ii < WHEEL_SIZE; ++ii) {
std::swap(buckets_[i][ii], buckets[i][ii]);
for (size_t i = 0; i < WHEEL_BUCKETS; ++i) {
for (size_t ii = 0; ii < WHEEL_SIZE; ++ii) {
std::swap(buckets_[i][ii], buckets[i][ii]);
}
}
}
#else
std::swap(buckets, buckets_);
std::swap(buckets, buckets_);
#endif
size_t count = 0;
for (auto& tick : buckets) {
for (auto& bucket : tick) {
while (!bucket.empty()) {
auto& cb = bucket.front();
cb.cancelTimeout();
cb.callbackCanceled();
count++;
for (auto& tick : buckets) {
for (auto& bucket : tick) {
while (!bucket.empty()) {
auto& cb = bucket.front();
cb.cancelTimeout();
cb.callbackCanceled();
count++;
}
}
}
}
......
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