From 3d288d8e9bd4f703b1ae32d3af730af0eb6d4c16 Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 11 Mar 2019 17:40:19 +0300 Subject: [PATCH] Possibly fix recursive calls to add_message_to_dialog. GitOrigin-RevId: c9ec21278582bc91beb6e2815f16b2f89673f587 --- td/telegram/MessagesManager.cpp | 51 ++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index d235702e5..a11d83a4f 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -10195,6 +10195,7 @@ void MessagesManager::remove_dialog_mention_notifications(Dialog *d) { if (d->unread_mention_count == 0) { return; } + CHECK(!d->being_added_message_id.is_valid()); VLOG(notifications) << "Remove mention notifications in " << d->dialog_id; @@ -18080,7 +18081,7 @@ NotificationGroupId MessagesManager::get_dialog_notification_group_id(DialogId d do { next_notification_group_id = td_->notification_manager_->get_next_notification_group_id(); if (!next_notification_group_id.is_valid()) { - return next_notification_group_id; + return NotificationGroupId(); } } while (get_message_notification_group_force(next_notification_group_id).dialog_id.is_valid()); group_info.group_id = next_notification_group_id; @@ -18091,7 +18092,7 @@ NotificationGroupId MessagesManager::get_dialog_notification_group_id(DialogId d notification_group_id_to_dialog_id_.emplace(next_notification_group_id, dialog_id); if (running_get_channel_difference(dialog_id) || get_channel_difference_to_logevent_id_.count(dialog_id) != 0) { - send_closure_later(td_->notification_manager_actor_, &NotificationManager::before_get_chat_difference, + send_closure_later(G()->notification_manager(), &NotificationManager::before_get_chat_difference, next_notification_group_id); } } @@ -18111,7 +18112,7 @@ NotificationId MessagesManager::get_next_notification_id(Dialog *d, Notification do { notification_id = td_->notification_manager_->get_next_notification_id(); if (!notification_id.is_valid()) { - return notification_id; + return NotificationId(); } } while (d->notification_id_to_message_id.count(notification_id) != 0 || d->new_secret_chat_notification_id == notification_id); // just in case @@ -21772,6 +21773,23 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq } } + if (*need_update) { + if (message_content_type == MessageContentType::PinMessage && + (is_dialog_pinned_message_notifications_disabled(d) || + !get_message_content_pinned_message_id(message->content.get()).is_valid())) { + // treat message pin without pinned message as an ordinary message + message->contains_mention = false; + } + if (message->contains_mention && is_dialog_mention_notifications_disabled(d)) { + // disable mention notification + message->is_mention_notification_disabled = true; + } + } + + if (message->contains_unread_mention && message_id.get() <= d->last_read_all_mentions_message_id.get()) { + message->contains_unread_mention = false; + } + if (*need_update && may_need_message_notification(d, message.get())) { // notification group must be created here because it may force adding new messages from database // in get_message_notification_group_force @@ -21790,12 +21808,14 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq } // there must be no two recursive calls to add_message_to_dialog - LOG_CHECK(!d->being_added_message_id.is_valid()) << d->being_added_message_id << " " << message_id << " " << source; + LOG_CHECK(!d->being_added_message_id.is_valid()) + << d->dialog_id << " " << d->being_added_message_id << " " << message_id << " " << *need_update << " " << source; d->being_added_message_id = message_id; if (d->new_secret_chat_notification_id.is_valid()) { remove_new_secret_chat_notification(d, true); } + if (message->message_id.get() > d->max_added_message_id.get()) { d->max_added_message_id = message->message_id; } @@ -21854,10 +21874,6 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq } } - if (message->contains_unread_mention && message_id.get() <= d->last_read_all_mentions_message_id.get()) { - message->contains_unread_mention = false; - } - if (message_id.is_yet_unsent() && message->reply_to_message_id.is_valid() && !message->reply_to_message_id.is_yet_unsent()) { replied_by_yet_unsent_messages_[FullMessageId{dialog_id, message->reply_to_message_id}]++; @@ -21965,17 +21981,6 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq } if (*need_update) { - if (message_content_type == MessageContentType::PinMessage && - (is_dialog_pinned_message_notifications_disabled(d) || - !get_message_content_pinned_message_id(message->content.get()).is_valid())) { - // treat message pin without pinned message as ordinary message - message->contains_mention = false; - } - if (message->contains_mention && is_dialog_mention_notifications_disabled(d)) { - // disable mention notification - message->is_mention_notification_disabled = true; - } - // notification must be added before updating unread_count to have correct total notification count // in get_message_notification_group_force add_new_message_notification(d, message.get(), false); @@ -23899,11 +23904,11 @@ void MessagesManager::do_get_channel_difference(DialogId dialog_id, int32 pts, b const Dialog *d = get_dialog(dialog_id); if (d != nullptr) { if (d->message_notification_group.group_id.is_valid()) { - send_closure_later(td_->notification_manager_actor_, &NotificationManager::before_get_chat_difference, + send_closure_later(G()->notification_manager(), &NotificationManager::before_get_chat_difference, d->message_notification_group.group_id); } if (d->mention_notification_group.group_id.is_valid()) { - send_closure_later(td_->notification_manager_actor_, &NotificationManager::before_get_chat_difference, + send_closure_later(G()->notification_manager(), &NotificationManager::before_get_chat_difference, d->mention_notification_group.group_id); } } @@ -24249,11 +24254,11 @@ void MessagesManager::after_get_channel_difference(DialogId dialog_id, bool succ if (d != nullptr) { if (d->message_notification_group.group_id.is_valid()) { - send_closure_later(td_->notification_manager_actor_, &NotificationManager::after_get_chat_difference, + send_closure_later(G()->notification_manager(), &NotificationManager::after_get_chat_difference, d->message_notification_group.group_id); } if (d->mention_notification_group.group_id.is_valid()) { - send_closure_later(td_->notification_manager_actor_, &NotificationManager::after_get_chat_difference, + send_closure_later(G()->notification_manager(), &NotificationManager::after_get_chat_difference, d->mention_notification_group.group_id); } }