From e671318c992574e0ab3b8957e7b0002377f41799 Mon Sep 17 00:00:00 2001 From: Arseny Smirnov Date: Mon, 29 Jan 2018 14:25:29 +0300 Subject: [PATCH] Fix MutliTimeout bug GitOrigin-RevId: 7c30c7232b2462d0ad232c71bf66b7af97a9fe38 --- tdactor/td/actor/Timeout.cpp | 6 +++++- tdactor/td/actor/Timeout.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tdactor/td/actor/Timeout.cpp b/tdactor/td/actor/Timeout.cpp index 6a8fd1061..fa2e5ffff 100644 --- a/tdactor/td/actor/Timeout.cpp +++ b/tdactor/td/actor/Timeout.cpp @@ -82,11 +82,15 @@ void MultiTimeout::timeout_expired() { while (!timeout_queue_.empty() && timeout_queue_.top_key() < now) { int64 key = static_cast(timeout_queue_.pop())->key; items_.erase(Item(key)); - callback_(data_, key); + expired_.push_back(key); } if (!items_.empty()) { update_timeout(); } + for (auto key : expired_) { + callback_(data_, key); + } + expired_.clear(); } } // namespace td diff --git a/tdactor/td/actor/Timeout.h b/tdactor/td/actor/Timeout.h index 3de82931f..a3a9ba191 100644 --- a/tdactor/td/actor/Timeout.h +++ b/tdactor/td/actor/Timeout.h @@ -117,6 +117,7 @@ class MultiTimeout final : public Actor { KHeap timeout_queue_; std::set items_; + std::vector expired_; void update_timeout();