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();