Add class OrderedMessages.
This commit is contained in:
parent
5ef84c5c65
commit
2ff3233115
@ -9812,7 +9812,7 @@ void MessagesManager::on_get_messages(vector<tl_object_ptr<telegram_api::Message
|
|||||||
|
|
||||||
bool MessagesManager::delete_newer_server_messages_at_the_end(Dialog *d, MessageId max_message_id) {
|
bool MessagesManager::delete_newer_server_messages_at_the_end(Dialog *d, MessageId max_message_id) {
|
||||||
vector<MessageId> message_ids;
|
vector<MessageId> message_ids;
|
||||||
find_newer_messages(d->ordered_messages.get(), max_message_id, message_ids);
|
find_newer_messages(d->ordered_messages.messages_.get(), max_message_id, message_ids);
|
||||||
if (message_ids.empty()) {
|
if (message_ids.empty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -11855,7 +11855,7 @@ void MessagesManager::delete_dialog_messages_by_date(DialogId dialog_id, int32 m
|
|||||||
// TODO delete in database by dates
|
// TODO delete in database by dates
|
||||||
|
|
||||||
vector<MessageId> message_ids;
|
vector<MessageId> message_ids;
|
||||||
find_messages_by_date(d, d->ordered_messages.get(), min_date, max_date, message_ids);
|
find_messages_by_date(d, d->ordered_messages.messages_.get(), min_date, max_date, message_ids);
|
||||||
|
|
||||||
delete_dialog_messages(d, message_ids, false, DELETE_MESSAGE_USER_REQUEST_SOURCE);
|
delete_dialog_messages(d, message_ids, false, DELETE_MESSAGE_USER_REQUEST_SOURCE);
|
||||||
|
|
||||||
@ -11953,8 +11953,8 @@ void MessagesManager::unload_dialog(DialogId dialog_id) {
|
|||||||
|
|
||||||
vector<MessageId> to_unload_message_ids;
|
vector<MessageId> to_unload_message_ids;
|
||||||
bool has_left_to_unload_messages = false;
|
bool has_left_to_unload_messages = false;
|
||||||
find_unloadable_messages(d, G()->unix_time_cached() - get_unload_dialog_delay() + 2, d->ordered_messages.get(),
|
find_unloadable_messages(d, G()->unix_time_cached() - get_unload_dialog_delay() + 2,
|
||||||
to_unload_message_ids, has_left_to_unload_messages);
|
d->ordered_messages.messages_.get(), to_unload_message_ids, has_left_to_unload_messages);
|
||||||
|
|
||||||
vector<int64> unloaded_message_ids;
|
vector<int64> unloaded_message_ids;
|
||||||
vector<unique_ptr<Message>> unloaded_messages;
|
vector<unique_ptr<Message>> unloaded_messages;
|
||||||
@ -13073,7 +13073,7 @@ void MessagesManager::set_dialog_max_unavailable_message_id(DialogId dialog_id,
|
|||||||
d->max_unavailable_message_id = max_unavailable_message_id;
|
d->max_unavailable_message_id = max_unavailable_message_id;
|
||||||
|
|
||||||
vector<MessageId> message_ids;
|
vector<MessageId> message_ids;
|
||||||
find_old_messages(d->ordered_messages.get(), max_unavailable_message_id, message_ids);
|
find_old_messages(d->ordered_messages.messages_.get(), max_unavailable_message_id, message_ids);
|
||||||
|
|
||||||
vector<int64> deleted_message_ids;
|
vector<int64> deleted_message_ids;
|
||||||
bool need_update_dialog_pos = false;
|
bool need_update_dialog_pos = false;
|
||||||
@ -15070,7 +15070,7 @@ void MessagesManager::remove_dialog_newer_messages(Dialog *d, MessageId from_mes
|
|||||||
invalidate_message_indexes(d);
|
invalidate_message_indexes(d);
|
||||||
|
|
||||||
vector<MessageId> to_delete_message_ids;
|
vector<MessageId> to_delete_message_ids;
|
||||||
find_newer_messages(d->ordered_messages.get(), from_message_id, to_delete_message_ids);
|
find_newer_messages(d->ordered_messages.messages_.get(), from_message_id, to_delete_message_ids);
|
||||||
td::remove_if(to_delete_message_ids, [](MessageId message_id) { return message_id.is_yet_unsent(); });
|
td::remove_if(to_delete_message_ids, [](MessageId message_id) { return message_id.is_yet_unsent(); });
|
||||||
if (!to_delete_message_ids.empty()) {
|
if (!to_delete_message_ids.empty()) {
|
||||||
LOG(INFO) << "Delete " << format::as_array(to_delete_message_ids) << " newer than " << from_message_id << " in "
|
LOG(INFO) << "Delete " << format::as_array(to_delete_message_ids) << " newer than " << from_message_id << " in "
|
||||||
@ -16498,7 +16498,7 @@ unique_ptr<MessagesManager::Message> MessagesManager::do_delete_message(Dialog *
|
|||||||
CHECK(m == result.get());
|
CHECK(m == result.get());
|
||||||
d->messages.erase(message_id);
|
d->messages.erase(message_id);
|
||||||
|
|
||||||
OrderedMessage::erase(&d->ordered_messages, message_id);
|
d->ordered_messages.erase(message_id);
|
||||||
|
|
||||||
d->being_deleted_message_id = MessageId();
|
d->being_deleted_message_id = MessageId();
|
||||||
|
|
||||||
@ -20501,8 +20501,8 @@ void MessagesManager::open_dialog(Dialog *d) {
|
|||||||
|
|
||||||
auto min_message_id = MessageId(ServerMessageId(1));
|
auto min_message_id = MessageId(ServerMessageId(1));
|
||||||
if (d->last_message_id == MessageId() && d->last_read_outbox_message_id < min_message_id &&
|
if (d->last_message_id == MessageId() && d->last_read_outbox_message_id < min_message_id &&
|
||||||
d->ordered_messages != nullptr && d->ordered_messages->message_id < min_message_id) {
|
d->ordered_messages.messages_ != nullptr && d->ordered_messages.messages_->message_id < min_message_id) {
|
||||||
OrderedMessage *ordered_message = d->ordered_messages.get();
|
OrderedMessage *ordered_message = d->ordered_messages.messages_.get();
|
||||||
while (ordered_message->right != nullptr) {
|
while (ordered_message->right != nullptr) {
|
||||||
ordered_message = ordered_message->right.get();
|
ordered_message = ordered_message->right.get();
|
||||||
}
|
}
|
||||||
@ -21096,8 +21096,8 @@ tl_object_ptr<td_api::messages> MessagesManager::get_dialog_history(DialogId dia
|
|||||||
bool have_a_gap = false;
|
bool have_a_gap = false;
|
||||||
if (*p == nullptr) {
|
if (*p == nullptr) {
|
||||||
// there is no gap if from_message_id is less than first message in the dialog
|
// there is no gap if from_message_id is less than first message in the dialog
|
||||||
if (left_tries == 0 && d->ordered_messages != nullptr && offset < 0) {
|
if (left_tries == 0 && d->ordered_messages.messages_ != nullptr && offset < 0) {
|
||||||
const OrderedMessage *cur = d->ordered_messages.get();
|
const OrderedMessage *cur = d->ordered_messages.messages_.get();
|
||||||
while (cur->left != nullptr) {
|
while (cur->left != nullptr) {
|
||||||
cur = cur->left.get();
|
cur = cur->left.get();
|
||||||
}
|
}
|
||||||
@ -22832,7 +22832,7 @@ int64 MessagesManager::get_dialog_message_by_date(DialogId dialog_id, int32 date
|
|||||||
} while (random_id == 0 || get_dialog_message_by_date_results_.count(random_id) > 0);
|
} while (random_id == 0 || get_dialog_message_by_date_results_.count(random_id) > 0);
|
||||||
get_dialog_message_by_date_results_[random_id]; // reserve place for result
|
get_dialog_message_by_date_results_[random_id]; // reserve place for result
|
||||||
|
|
||||||
auto message_id = find_message_by_date(d, d->ordered_messages.get(), date);
|
auto message_id = find_message_by_date(d, d->ordered_messages.messages_.get(), date);
|
||||||
if (message_id.is_valid() &&
|
if (message_id.is_valid() &&
|
||||||
(message_id == d->last_message_id || (*MessagesConstIterator(d, message_id))->have_next)) {
|
(message_id == d->last_message_id || (*MessagesConstIterator(d, message_id))->have_next)) {
|
||||||
get_dialog_message_by_date_results_[random_id] = {dialog_id, message_id};
|
get_dialog_message_by_date_results_[random_id] = {dialog_id, message_id};
|
||||||
@ -22948,7 +22948,7 @@ void MessagesManager::on_get_dialog_message_by_date_from_database(DialogId dialo
|
|||||||
if (result.is_ok()) {
|
if (result.is_ok()) {
|
||||||
Message *m = on_get_message_from_database(d, result.ok(), false, "on_get_dialog_message_by_date_from_database");
|
Message *m = on_get_message_from_database(d, result.ok(), false, "on_get_dialog_message_by_date_from_database");
|
||||||
if (m != nullptr) {
|
if (m != nullptr) {
|
||||||
auto message_id = find_message_by_date(d, d->ordered_messages.get(), date);
|
auto message_id = find_message_by_date(d, d->ordered_messages.messages_.get(), date);
|
||||||
if (!message_id.is_valid()) {
|
if (!message_id.is_valid()) {
|
||||||
LOG(ERROR) << "Failed to find " << m->message_id << " in " << dialog_id << " by date " << date;
|
LOG(ERROR) << "Failed to find " << m->message_id << " in " << dialog_id << " by date " << date;
|
||||||
message_id = m->message_id;
|
message_id = m->message_id;
|
||||||
@ -22972,7 +22972,7 @@ void MessagesManager::get_dialog_message_by_date_from_server(const Dialog *d, in
|
|||||||
return promise.set_value(Unit());
|
return promise.set_value(Unit());
|
||||||
}
|
}
|
||||||
|
|
||||||
auto message_id = find_message_by_date(d, d->ordered_messages.get(), date);
|
auto message_id = find_message_by_date(d, d->ordered_messages.messages_.get(), date);
|
||||||
if (message_id.is_valid()) {
|
if (message_id.is_valid()) {
|
||||||
get_dialog_message_by_date_results_[random_id] = {d->dialog_id, message_id};
|
get_dialog_message_by_date_results_[random_id] = {d->dialog_id, message_id};
|
||||||
}
|
}
|
||||||
@ -23010,7 +23010,7 @@ void MessagesManager::on_get_dialog_message_by_date_success(DialogId dialog_id,
|
|||||||
if (result != FullMessageId()) {
|
if (result != FullMessageId()) {
|
||||||
const Dialog *d = get_dialog(dialog_id);
|
const Dialog *d = get_dialog(dialog_id);
|
||||||
CHECK(d != nullptr);
|
CHECK(d != nullptr);
|
||||||
auto message_id = find_message_by_date(d, d->ordered_messages.get(), date);
|
auto message_id = find_message_by_date(d, d->ordered_messages.messages_.get(), date);
|
||||||
if (!message_id.is_valid()) {
|
if (!message_id.is_valid()) {
|
||||||
LOG(ERROR) << "Failed to find " << result.get_message_id() << " in " << dialog_id << " by date " << date;
|
LOG(ERROR) << "Failed to find " << result.get_message_id() << " in " << dialog_id << " by date " << date;
|
||||||
message_id = result.get_message_id();
|
message_id = result.get_message_id();
|
||||||
@ -34903,7 +34903,7 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||||||
}
|
}
|
||||||
if (!is_attached && !message_id.is_yet_unsent()) {
|
if (!is_attached && !message_id.is_yet_unsent()) {
|
||||||
// message may be attached to the next message if there is no previous message
|
// message may be attached to the next message if there is no previous message
|
||||||
OrderedMessage *cur = d->ordered_messages.get();
|
OrderedMessage *cur = d->ordered_messages.messages_.get();
|
||||||
OrderedMessage *next_message = nullptr;
|
OrderedMessage *next_message = nullptr;
|
||||||
while (cur != nullptr) {
|
while (cur != nullptr) {
|
||||||
if (cur->message_id < message_id) {
|
if (cur->message_id < message_id) {
|
||||||
@ -35163,7 +35163,7 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||||||
Message *result_message = message.get();
|
Message *result_message = message.get();
|
||||||
d->messages.set(message_id, std::move(message));
|
d->messages.set(message_id, std::move(message));
|
||||||
|
|
||||||
OrderedMessage *ordered_message = OrderedMessage::insert(&d->ordered_messages, message_id);
|
OrderedMessage *ordered_message = d->ordered_messages.insert(message_id);
|
||||||
if (!is_attached) {
|
if (!is_attached) {
|
||||||
if (have_next) {
|
if (have_next) {
|
||||||
CHECK(!have_previous);
|
CHECK(!have_previous);
|
||||||
|
@ -1442,7 +1442,8 @@ class MessagesManager final : public Actor {
|
|||||||
string client_data;
|
string client_data;
|
||||||
|
|
||||||
WaitFreeHashMap<MessageId, unique_ptr<Message>, MessageIdHash> messages;
|
WaitFreeHashMap<MessageId, unique_ptr<Message>, MessageIdHash> messages;
|
||||||
unique_ptr<OrderedMessage> ordered_messages;
|
|
||||||
|
OrderedMessages ordered_messages;
|
||||||
|
|
||||||
unique_ptr<DialogScheduledMessages> scheduled_messages;
|
unique_ptr<DialogScheduledMessages> scheduled_messages;
|
||||||
|
|
||||||
@ -1678,7 +1679,8 @@ class MessagesManager final : public Actor {
|
|||||||
public:
|
public:
|
||||||
MessagesIterator() = default;
|
MessagesIterator() = default;
|
||||||
|
|
||||||
MessagesIterator(Dialog *d, MessageId message_id) : MessagesIteratorBase(d->ordered_messages.get(), message_id) {
|
MessagesIterator(Dialog *d, MessageId message_id)
|
||||||
|
: MessagesIteratorBase(d->ordered_messages.messages_.get(), message_id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
OrderedMessage *operator*() const {
|
OrderedMessage *operator*() const {
|
||||||
@ -1691,7 +1693,7 @@ class MessagesManager final : public Actor {
|
|||||||
MessagesConstIterator() = default;
|
MessagesConstIterator() = default;
|
||||||
|
|
||||||
MessagesConstIterator(const Dialog *d, MessageId message_id)
|
MessagesConstIterator(const Dialog *d, MessageId message_id)
|
||||||
: MessagesIteratorBase(d->ordered_messages.get(), message_id) {
|
: MessagesIteratorBase(d->ordered_messages.messages_.get(), message_id) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const OrderedMessage *operator*() const {
|
const OrderedMessage *operator*() const {
|
||||||
|
@ -8,8 +8,9 @@
|
|||||||
|
|
||||||
namespace td {
|
namespace td {
|
||||||
|
|
||||||
OrderedMessage *OrderedMessage::insert(unique_ptr<OrderedMessage> *v, MessageId message_id) {
|
OrderedMessage *OrderedMessages::insert(MessageId message_id) {
|
||||||
auto random_y = static_cast<int32>(static_cast<uint32>(message_id.get() * 2101234567u));
|
auto random_y = static_cast<int32>(static_cast<uint32>(message_id.get() * 2101234567u));
|
||||||
|
unique_ptr<OrderedMessage> *v = &messages_;
|
||||||
while (*v != nullptr && (*v)->random_y >= random_y) {
|
while (*v != nullptr && (*v)->random_y >= random_y) {
|
||||||
if ((*v)->message_id.get() < message_id.get()) {
|
if ((*v)->message_id.get() < message_id.get()) {
|
||||||
v = &(*v)->right;
|
v = &(*v)->right;
|
||||||
@ -45,7 +46,8 @@ OrderedMessage *OrderedMessage::insert(unique_ptr<OrderedMessage> *v, MessageId
|
|||||||
return v->get();
|
return v->get();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OrderedMessage::erase(unique_ptr<OrderedMessage> *v, MessageId message_id) {
|
void OrderedMessages::erase(MessageId message_id) {
|
||||||
|
unique_ptr<OrderedMessage> *v = &messages_;
|
||||||
while (*v != nullptr) {
|
while (*v != nullptr) {
|
||||||
if ((*v)->message_id.get() < message_id.get()) {
|
if ((*v)->message_id.get() < message_id.get()) {
|
||||||
v = &(*v)->right;
|
v = &(*v)->right;
|
||||||
|
@ -22,10 +22,14 @@ struct OrderedMessage {
|
|||||||
|
|
||||||
unique_ptr<OrderedMessage> left;
|
unique_ptr<OrderedMessage> left;
|
||||||
unique_ptr<OrderedMessage> right;
|
unique_ptr<OrderedMessage> right;
|
||||||
|
};
|
||||||
|
|
||||||
static OrderedMessage *insert(unique_ptr<OrderedMessage> *v, MessageId message_id);
|
struct OrderedMessages {
|
||||||
|
unique_ptr<OrderedMessage> messages_;
|
||||||
|
|
||||||
static void erase(unique_ptr<OrderedMessage> *v, MessageId message_id);
|
OrderedMessage *insert(MessageId message_id);
|
||||||
|
|
||||||
|
void erase(MessageId message_id);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
Loading…
Reference in New Issue
Block a user