diff --git a/td/telegram/DelayDispatcher.cpp b/td/telegram/DelayDispatcher.cpp index f42ee662..73e4f6c3 100644 --- a/td/telegram/DelayDispatcher.cpp +++ b/td/telegram/DelayDispatcher.cpp @@ -44,4 +44,22 @@ void DelayDispatcher::loop() { set_timeout_at(wakeup_at_.at()); } +void DelayDispatcher::close_silent() { + while (!queue_.empty()) { + auto query = std::move(queue_.front()); + queue_.pop(); + query.net_query->clear(); + } + stop(); +} + +void DelayDispatcher::tear_down() { + while (!queue_.empty()) { + auto query = std::move(queue_.front()); + queue_.pop(); + query.net_query->set_error(Status::Error(500, "Request aborted")); + send_closure(std::move(query.callback), &NetQueryCallback::on_result, std::move(query.net_query)); + } +} + } // namespace td diff --git a/td/telegram/DelayDispatcher.h b/td/telegram/DelayDispatcher.h index 42e836b2..f91d7b17 100644 --- a/td/telegram/DelayDispatcher.h +++ b/td/telegram/DelayDispatcher.h @@ -24,6 +24,8 @@ class DelayDispatcher : public Actor { void send_with_callback(NetQueryPtr query, ActorShared callback); void send_with_callback_and_delay(NetQueryPtr query, ActorShared callback, double delay); + void close_silent(); + private: struct Query { NetQueryPtr net_query; @@ -35,6 +37,7 @@ class DelayDispatcher : public Actor { double default_delay_; void loop() override; + void tear_down() override; }; } // namespace td diff --git a/td/telegram/files/FileLoader.cpp b/td/telegram/files/FileLoader.cpp index c8b10024..0ca525eb 100644 --- a/td/telegram/files/FileLoader.cpp +++ b/td/telegram/files/FileLoader.cpp @@ -187,6 +187,8 @@ void FileLoader::tear_down() { for (auto &it : part_map_) { it.second.second.reset(); // cancel_query(it.second.second); } + ordered_parts_.clear([](auto &&part) { part.second->clear(); }); + send_closure(std::move(delay_dispatcher_), &DelayDispatcher::close_silent); } void FileLoader::update_estimated_limit() { if (stop_flag_) { diff --git a/tdutils/td/utils/OrderedEventsProcessor.h b/tdutils/td/utils/OrderedEventsProcessor.h index 4515b746..fa74de03 100644 --- a/tdutils/td/utils/OrderedEventsProcessor.h +++ b/tdutils/td/utils/OrderedEventsProcessor.h @@ -23,6 +23,18 @@ class OrderedEventsProcessor { explicit OrderedEventsProcessor(SeqNo offset) : offset_(offset), begin_(offset_), end_(offset_) { } + template + void clear(FunctionT &&function) { + for (auto &it : data_array_) { + if (it.second) { + function(std::move(it.first)); + } + } + *this = OrderedEventsProcessor(); + } + void clear() { + *this = OrderedEventsProcessor(); + } template void add(SeqNo seq_no, FromDataT &&data, FunctionT &&function) { CHECK(seq_no >= begin_) << seq_no << ">=" << begin_; // or ignore?