Fix crash in scheduled messages tear-down.

This commit is contained in:
John Preston 2024-04-16 19:32:07 +04:00
parent 5433f95eda
commit a3e593b747
3 changed files with 12 additions and 1 deletions

View File

@ -113,9 +113,16 @@ ScheduledMessages::ScheduledMessages(not_null<Main::Session*> session)
} }
ScheduledMessages::~ScheduledMessages() { ScheduledMessages::~ScheduledMessages() {
for (const auto &request : _requests) { Expects(_data.empty());
Expects(_requests.empty());
}
void ScheduledMessages::clear() {
_lifetime.destroy();
for (const auto &request : base::take(_requests)) {
_session->api().request(request.second.requestId).cancel(); _session->api().request(request.second.requestId).cancel();
} }
base::take(_data);
} }
void ScheduledMessages::clearOldRequests() { void ScheduledMessages::clearOldRequests() {

View File

@ -55,6 +55,8 @@ public:
[[nodiscard]] Data::MessagesSlice list( [[nodiscard]] Data::MessagesSlice list(
not_null<const Data::ForumTopic*> topic) const; not_null<const Data::ForumTopic*> topic) const;
void clear();
private: private:
using OwnedItem = std::unique_ptr<HistoryItem, HistoryItem::Destroyer>; using OwnedItem = std::unique_ptr<HistoryItem, HistoryItem::Destroyer>;
struct List { struct List {

View File

@ -40,6 +40,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/business/data_business_chatbots.h" #include "data/business/data_business_chatbots.h"
#include "data/business/data_business_info.h" #include "data/business/data_business_info.h"
#include "data/business/data_shortcut_messages.h" #include "data/business/data_shortcut_messages.h"
#include "data/components/scheduled_messages.h"
#include "data/stickers/data_stickers.h" #include "data/stickers/data_stickers.h"
#include "data/notify/data_notify_settings.h" #include "data/notify/data_notify_settings.h"
#include "data/data_bot_app.h" #include "data/data_bot_app.h"
@ -394,6 +395,7 @@ void Session::clear() {
_histories->unloadAll(); _histories->unloadAll();
_shortcutMessages = nullptr; _shortcutMessages = nullptr;
_session->scheduledMessages().clear();
_dependentMessages.clear(); _dependentMessages.clear();
base::take(_messages); base::take(_messages);
base::take(_nonChannelMessages); base::take(_nonChannelMessages);