From a2a864852d81279ca8ca0f67f2d0e67d229aa692 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 25 Feb 2019 19:27:06 +0300 Subject: [PATCH] Do not store empty promises in QueryCombiner. GitOrigin-RevId: 5222075d6722008902b0337d2aee369aee0f005c --- td/telegram/QueryCombiner.cpp | 11 +++++++---- td/telegram/QueryCombiner.h | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/td/telegram/QueryCombiner.cpp b/td/telegram/QueryCombiner.cpp index e4cb907be..c69d1d1e0 100644 --- a/td/telegram/QueryCombiner.cpp +++ b/td/telegram/QueryCombiner.cpp @@ -10,12 +10,15 @@ namespace td { void QueryCombiner::add_query(int64 query_id, Promise> &&send_query, Promise &&promise) { auto &query = queries_[query_id]; - query.promises.push_back(std::move(promise)); - if (query.promises.size() != 1) { - // query has already been sent, just wait for the result + if (promise) { + query.promises.push_back(std::move(promise)); + } + if (query.is_sent) { + // just wait for the result return; } + query.is_sent = true; send_query.set_value(PromiseCreator::lambda([actor_id = actor_id(this), query_id](Result &&result) { send_closure(actor_id, &QueryCombiner::on_get_query_result, query_id, std::move(result)); })); @@ -24,7 +27,7 @@ void QueryCombiner::add_query(int64 query_id, Promise> &&send_quer void QueryCombiner::on_get_query_result(int64 query_id, Result &&result) { auto it = queries_.find(query_id); CHECK(it != queries_.end()); - CHECK(!it->second.promises.empty()); + CHECK(it->second.is_sent); auto promises = std::move(it->second.promises); queries_.erase(it); diff --git a/td/telegram/QueryCombiner.h b/td/telegram/QueryCombiner.h index 26aad601d..61d781d72 100644 --- a/td/telegram/QueryCombiner.h +++ b/td/telegram/QueryCombiner.h @@ -28,6 +28,7 @@ class QueryCombiner : public Actor { private: struct QueryInfo { vector> promises; + bool is_sent = false; }; std::unordered_map queries_;