Add memory_cleanup on tear_down, and add more memory_cleanup.
This commit is contained in:
parent
5af21e5612
commit
a79f835de0
@ -145,6 +145,9 @@ AnimationsManager::AnimationsManager(Td *td, ActorShared<> parent) : td_(td), pa
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AnimationsManager::tear_down() {
|
void AnimationsManager::tear_down() {
|
||||||
|
// Completely clear memory when closing, to avoid memory leaks
|
||||||
|
memory_cleanup(true);
|
||||||
|
|
||||||
parent_.reset();
|
parent_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -965,13 +968,23 @@ void AnimationsManager::get_current_state(vector<td_api::object_ptr<td_api::Upda
|
|||||||
updates.push_back(std::move(update_animation_search_parameters));
|
updates.push_back(std::move(update_animation_search_parameters));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationsManager::memory_cleanup() {
|
void AnimationsManager::memory_cleanup() {
|
||||||
|
memory_cleanup(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AnimationsManager::memory_cleanup(bool full) {
|
||||||
animations_.clear();
|
animations_.clear();
|
||||||
animations_.rehash(0);
|
animations_.rehash(0);
|
||||||
|
saved_animation_ids_.clear();
|
||||||
|
saved_animation_file_ids_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationsManager::memory_stats(vector<string> &output) {
|
void AnimationsManager::memory_stats(vector<string> &output) {
|
||||||
output.push_back("\"animations_\":"); output.push_back(std::to_string(animations_.size()));
|
output.push_back("\"animations_\":"); output.push_back(std::to_string(animations_.size()));
|
||||||
output.push_back(",");
|
output.push_back(",");
|
||||||
|
output.push_back("\"saved_animation_ids_\":"); output.push_back(std::to_string(this->saved_animation_ids_.size()));
|
||||||
|
output.push_back(",");
|
||||||
output.push_back("\"saved_animation_file_ids_\":"); output.push_back(std::to_string(this->saved_animation_file_ids_.size()));
|
output.push_back("\"saved_animation_file_ids_\":"); output.push_back(std::to_string(this->saved_animation_file_ids_.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,6 +118,8 @@ class AnimationsManager : public Actor {
|
|||||||
bool is_changed = true;
|
bool is_changed = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void memory_cleanup(bool full);
|
||||||
|
|
||||||
const Animation *get_animation(FileId file_id) const;
|
const Animation *get_animation(FileId file_id) const;
|
||||||
|
|
||||||
FileId on_get_animation(unique_ptr<Animation> new_animation, bool replace);
|
FileId on_get_animation(unique_ptr<Animation> new_animation, bool replace);
|
||||||
|
@ -1121,4 +1121,36 @@ void BackgroundManager::get_current_state(vector<td_api::object_ptr<td_api::Upda
|
|||||||
updates.push_back(get_update_selected_background_object(true));
|
updates.push_back(get_update_selected_background_object(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BackgroundManager::memory_cleanup() {
|
||||||
|
memory_cleanup(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackgroundManager::memory_cleanup(bool full) {
|
||||||
|
backgrounds_.clear();
|
||||||
|
backgrounds_.rehash(0);
|
||||||
|
background_id_to_file_source_id_.clear();
|
||||||
|
background_id_to_file_source_id_.rehash(0);
|
||||||
|
name_to_background_id_.clear();
|
||||||
|
name_to_background_id_.rehash(0);
|
||||||
|
file_id_to_background_id_.clear();
|
||||||
|
file_id_to_background_id_.rehash(0);
|
||||||
|
loaded_from_database_backgrounds_.clear();
|
||||||
|
loaded_from_database_backgrounds_.rehash(0);
|
||||||
|
installed_background_ids_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BackgroundManager::memory_stats(vector<string> &output) {
|
||||||
|
output.push_back("\"backgrounds_\":"); output.push_back(std::to_string(backgrounds_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"background_id_to_file_source_id_\":"); output.push_back(std::to_string(background_id_to_file_source_id_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"name_to_background_id_\":"); output.push_back(std::to_string(name_to_background_id_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"file_id_to_background_id_\":"); output.push_back(std::to_string(file_id_to_background_id_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"loaded_from_database_backgrounds_\":"); output.push_back(std::to_string(loaded_from_database_backgrounds_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"installed_background_ids_\":"); output.push_back(std::to_string(installed_background_ids_.size()));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -33,6 +33,10 @@ class BackgroundManager : public Actor {
|
|||||||
public:
|
public:
|
||||||
BackgroundManager(Td *td, ActorShared<> parent);
|
BackgroundManager(Td *td, ActorShared<> parent);
|
||||||
|
|
||||||
|
void memory_cleanup();
|
||||||
|
|
||||||
|
void memory_stats(vector<string> &output);
|
||||||
|
|
||||||
void get_backgrounds(Promise<Unit> &&promise);
|
void get_backgrounds(Promise<Unit> &&promise);
|
||||||
|
|
||||||
Result<string> get_background_url(const string &name,
|
Result<string> get_background_url(const string &name,
|
||||||
@ -92,6 +96,8 @@ class BackgroundManager : public Actor {
|
|||||||
|
|
||||||
void tear_down() override;
|
void tear_down() override;
|
||||||
|
|
||||||
|
void memory_cleanup(bool full);
|
||||||
|
|
||||||
static string get_background_database_key(bool for_dark_theme);
|
static string get_background_database_key(bool for_dark_theme);
|
||||||
|
|
||||||
void save_background_id(bool for_dark_theme) const;
|
void save_background_id(bool for_dark_theme) const;
|
||||||
|
@ -2952,6 +2952,8 @@ ContactsManager::ContactsManager(Td *td, ActorShared<> parent) : td_(td), parent
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ContactsManager::tear_down() {
|
void ContactsManager::tear_down() {
|
||||||
|
// Completely clear memory when closing, to avoid memory leaks
|
||||||
|
memory_cleanup(true);
|
||||||
parent_.reset();
|
parent_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -14681,6 +14683,10 @@ void ContactsManager::get_current_state(vector<td_api::object_ptr<td_api::Update
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ContactsManager::memory_cleanup() {
|
void ContactsManager::memory_cleanup() {
|
||||||
|
memory_cleanup(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ContactsManager::memory_cleanup(bool full) {
|
||||||
auto time = std::time(nullptr);
|
auto time = std::time(nullptr);
|
||||||
|
|
||||||
auto user_ttl = !G()->shared_config().get_option_integer("delete_user_reference_after_seconds", 3600);
|
auto user_ttl = !G()->shared_config().get_option_integer("delete_user_reference_after_seconds", 3600);
|
||||||
@ -14688,7 +14694,9 @@ void ContactsManager::memory_cleanup() {
|
|||||||
auto chat_access_hash_cleanup = !G()->shared_config().get_option_boolean("experiment_enable_chat_access_hash_cleanup", true);
|
auto chat_access_hash_cleanup = !G()->shared_config().get_option_boolean("experiment_enable_chat_access_hash_cleanup", true);
|
||||||
|
|
||||||
/* DESTROY INVALID USERS */
|
/* DESTROY INVALID USERS */
|
||||||
{
|
if (full) {
|
||||||
|
users_.clear();
|
||||||
|
} else {
|
||||||
auto it = users_.begin();
|
auto it = users_.begin();
|
||||||
while (it != users_.end()) {
|
while (it != users_.end()) {
|
||||||
//auto &user = it->second;
|
//auto &user = it->second;
|
||||||
@ -14720,9 +14728,11 @@ void ContactsManager::memory_cleanup() {
|
|||||||
my_photo_file_id_.clear();
|
my_photo_file_id_.clear();
|
||||||
my_photo_file_id_.rehash(0);
|
my_photo_file_id_.rehash(0);
|
||||||
|
|
||||||
if (chat_access_hash_cleanup) {
|
if (full || chat_access_hash_cleanup) {
|
||||||
/* DESTROY INVALID CHATS */
|
/* DESTROY INVALID CHATS */
|
||||||
{
|
if (full) {
|
||||||
|
chats_.clear();
|
||||||
|
} else {
|
||||||
auto it = chats_.begin();
|
auto it = chats_.begin();
|
||||||
while (it != chats_.end()) {
|
while (it != chats_.end()) {
|
||||||
//auto &chat = it->second;
|
//auto &chat = it->second;
|
||||||
@ -14738,21 +14748,22 @@ void ContactsManager::memory_cleanup() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
chats_.rehash(0);
|
chats_.rehash(0);
|
||||||
}
|
}
|
||||||
chats_full_.clear();
|
chats_full_.clear();
|
||||||
chats_full_.rehash(0);
|
chats_full_.rehash(0);
|
||||||
unknown_chats_.clear();
|
unknown_chats_.clear();
|
||||||
unknown_chats_.rehash(0);
|
unknown_chats_.rehash(0);
|
||||||
if (chat_access_hash_cleanup) {
|
if (full || chat_access_hash_cleanup) {
|
||||||
chat_full_file_source_ids_.clear();
|
chat_full_file_source_ids_.clear();
|
||||||
chat_full_file_source_ids_.rehash(0);
|
chat_full_file_source_ids_.rehash(0);
|
||||||
min_channels_.clear();
|
min_channels_.clear();
|
||||||
min_channels_.rehash(0);
|
min_channels_.rehash(0);
|
||||||
|
|
||||||
/* DESTROY INVALID CHANNELS */
|
/* DESTROY INVALID CHANNELS */
|
||||||
{
|
if (full) {
|
||||||
|
channels_.clear();
|
||||||
|
} else {
|
||||||
auto it = channels_.begin();
|
auto it = channels_.begin();
|
||||||
while (it != channels_.end()) {
|
while (it != channels_.end()) {
|
||||||
//auto &channel = it->second;
|
//auto &channel = it->second;
|
||||||
@ -14775,16 +14786,18 @@ void ContactsManager::memory_cleanup() {
|
|||||||
}
|
}
|
||||||
unknown_channels_.clear();
|
unknown_channels_.clear();
|
||||||
unknown_channels_.rehash(0);
|
unknown_channels_.rehash(0);
|
||||||
if (chat_access_hash_cleanup) {
|
if (full || chat_access_hash_cleanup) {
|
||||||
channel_full_file_source_ids_.clear();
|
channel_full_file_source_ids_.clear();
|
||||||
channel_full_file_source_ids_.rehash(0);
|
channel_full_file_source_ids_.rehash(0);
|
||||||
}
|
}
|
||||||
//secret_chats_.clear();
|
if (full) {
|
||||||
//secret_chats_.rehash(0);
|
secret_chats_.clear();
|
||||||
//unknown_secret_chats_.clear();
|
secret_chats_.rehash(0);
|
||||||
//unknown_secret_chats_.rehash(0);
|
unknown_secret_chats_.clear();
|
||||||
//secret_chats_with_user_.clear();
|
unknown_secret_chats_.rehash(0);
|
||||||
//secret_chats_with_user_.rehash(0);
|
secret_chats_with_user_.clear();
|
||||||
|
secret_chats_with_user_.rehash(0);
|
||||||
|
}
|
||||||
dialog_invite_links_.clear();
|
dialog_invite_links_.clear();
|
||||||
dialog_invite_links_.rehash(0);
|
dialog_invite_links_.rehash(0);
|
||||||
invite_link_infos_.clear();
|
invite_link_infos_.clear();
|
||||||
@ -14811,10 +14824,12 @@ void ContactsManager::memory_cleanup() {
|
|||||||
loaded_from_database_channels_.rehash(0);
|
loaded_from_database_channels_.rehash(0);
|
||||||
unavailable_channel_fulls_.clear();
|
unavailable_channel_fulls_.clear();
|
||||||
unavailable_channel_fulls_.rehash(0);
|
unavailable_channel_fulls_.rehash(0);
|
||||||
//load_secret_chat_from_database_queries_.clear();
|
if (full) {
|
||||||
//load_secret_chat_from_database_queries_.rehash(0);
|
load_secret_chat_from_database_queries_.clear();
|
||||||
//loaded_from_database_secret_chats_.clear();
|
load_secret_chat_from_database_queries_.rehash(0);
|
||||||
//loaded_from_database_secret_chats_.rehash(0);
|
loaded_from_database_secret_chats_.clear();
|
||||||
|
loaded_from_database_secret_chats_.rehash(0);
|
||||||
|
}
|
||||||
dialog_administrators_.clear();
|
dialog_administrators_.clear();
|
||||||
dialog_administrators_.rehash(0);
|
dialog_administrators_.rehash(0);
|
||||||
uploaded_profile_photos_.clear();
|
uploaded_profile_photos_.clear();
|
||||||
|
@ -1067,6 +1067,8 @@ class ContactsManager : public Actor {
|
|||||||
|
|
||||||
static const CSlice INVITE_LINK_URLS[3];
|
static const CSlice INVITE_LINK_URLS[3];
|
||||||
|
|
||||||
|
void memory_cleanup(bool full);
|
||||||
|
|
||||||
static bool have_input_peer_user(const User *u, AccessRights access_rights);
|
static bool have_input_peer_user(const User *u, AccessRights access_rights);
|
||||||
static bool have_input_peer_chat(const Chat *c, AccessRights access_rights);
|
static bool have_input_peer_chat(const Chat *c, AccessRights access_rights);
|
||||||
bool have_input_peer_channel(const Channel *c, ChannelId channel_id, AccessRights access_rights,
|
bool have_input_peer_channel(const Channel *c, ChannelId channel_id, AccessRights access_rights,
|
||||||
|
@ -466,10 +466,16 @@ GroupCallManager::GroupCallManager(Td *td, ActorShared<> parent) : td_(td), pare
|
|||||||
GroupCallManager::~GroupCallManager() = default;
|
GroupCallManager::~GroupCallManager() = default;
|
||||||
|
|
||||||
void GroupCallManager::tear_down() {
|
void GroupCallManager::tear_down() {
|
||||||
|
// Completely clear memory when closing, to avoid memory leaks
|
||||||
|
memory_cleanup(true);
|
||||||
parent_.reset();
|
parent_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GroupCallManager::memory_cleanup() {
|
void GroupCallManager::memory_cleanup() {
|
||||||
|
memory_cleanup(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GroupCallManager::memory_cleanup(bool full) {
|
||||||
this->group_call_participants_.clear();
|
this->group_call_participants_.clear();
|
||||||
this->group_call_participants_.rehash(0);
|
this->group_call_participants_.rehash(0);
|
||||||
this->group_call_recent_speakers_.clear();
|
this->group_call_recent_speakers_.clear();
|
||||||
|
@ -97,6 +97,8 @@ class GroupCallManager : public Actor {
|
|||||||
|
|
||||||
void tear_down() override;
|
void tear_down() override;
|
||||||
|
|
||||||
|
void memory_cleanup(bool full);
|
||||||
|
|
||||||
static void on_check_group_call_is_joined_timeout_callback(void *group_call_manager_ptr, int64 group_call_id_int);
|
static void on_check_group_call_is_joined_timeout_callback(void *group_call_manager_ptr, int64 group_call_id_int);
|
||||||
|
|
||||||
void on_check_group_call_is_joined_timeout(GroupCallId group_call_id);
|
void on_check_group_call_is_joined_timeout(GroupCallId group_call_id);
|
||||||
|
@ -165,6 +165,8 @@ InlineQueriesManager::InlineQueriesManager(Td *td, ActorShared<> parent) : td_(t
|
|||||||
}
|
}
|
||||||
|
|
||||||
void InlineQueriesManager::tear_down() {
|
void InlineQueriesManager::tear_down() {
|
||||||
|
// Completely clear memory when closing, to avoid memory leaks
|
||||||
|
memory_cleanup(true);
|
||||||
parent_.reset();
|
parent_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1846,4 +1848,28 @@ void InlineQueriesManager::remove_recent_inline_bot(UserId bot_user_id, Promise<
|
|||||||
promise.set_value(Unit());
|
promise.set_value(Unit());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InlineQueriesManager::memory_cleanup() {
|
||||||
|
memory_cleanup(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InlineQueriesManager::memory_cleanup(bool full) {
|
||||||
|
recently_used_bot_user_ids_.clear();
|
||||||
|
inline_query_results_.clear();
|
||||||
|
inline_query_results_.rehash(0);
|
||||||
|
inline_message_contents_.clear();
|
||||||
|
inline_message_contents_.rehash(0);
|
||||||
|
query_id_to_bot_user_id_.clear();
|
||||||
|
query_id_to_bot_user_id_.rehash(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InlineQueriesManager::memory_stats(vector<string> &output) {
|
||||||
|
output.push_back("\"recently_used_bot_user_ids_\":"); output.push_back(std::to_string(recently_used_bot_user_ids_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"inline_query_results_\":"); output.push_back(std::to_string(inline_query_results_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"inline_message_contents_\":"); output.push_back(std::to_string(inline_message_contents_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"query_id_to_bot_user_id_\":"); output.push_back(std::to_string(query_id_to_bot_user_id_.size()));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -39,6 +39,10 @@ class InlineQueriesManager : public Actor {
|
|||||||
public:
|
public:
|
||||||
InlineQueriesManager(Td *td, ActorShared<> parent);
|
InlineQueriesManager(Td *td, ActorShared<> parent);
|
||||||
|
|
||||||
|
void memory_cleanup();
|
||||||
|
|
||||||
|
void memory_stats(vector<string> &output);
|
||||||
|
|
||||||
void after_get_difference();
|
void after_get_difference();
|
||||||
|
|
||||||
void answer_inline_query(int64 inline_query_id, bool is_personal,
|
void answer_inline_query(int64 inline_query_id, bool is_personal,
|
||||||
@ -112,6 +116,8 @@ class InlineQueriesManager : public Actor {
|
|||||||
|
|
||||||
void tear_down() override;
|
void tear_down() override;
|
||||||
|
|
||||||
|
void memory_cleanup(bool full);
|
||||||
|
|
||||||
int32 recently_used_bots_loaded_ = 0; // 0 - not loaded, 1 - load request was sent, 2 - loaded
|
int32 recently_used_bots_loaded_ = 0; // 0 - not loaded, 1 - load request was sent, 2 - loaded
|
||||||
MultiPromiseActor resolve_recent_inline_bots_multipromise_{"ResolveRecentInlineBotsMultiPromiseActor"};
|
MultiPromiseActor resolve_recent_inline_bots_multipromise_{"ResolveRecentInlineBotsMultiPromiseActor"};
|
||||||
|
|
||||||
|
@ -28,6 +28,9 @@
|
|||||||
#include "td/telegram/AudiosManager.h"
|
#include "td/telegram/AudiosManager.h"
|
||||||
#include "td/telegram/AnimationsManager.h"
|
#include "td/telegram/AnimationsManager.h"
|
||||||
#include "td/telegram/GroupCallManager.h"
|
#include "td/telegram/GroupCallManager.h"
|
||||||
|
#include "td/telegram/BackgroundManager.h"
|
||||||
|
#include "td/telegram/PollManager.h"
|
||||||
|
#include "td/telegram/InlineQueriesManager.h"
|
||||||
#include "td/telegram/files/FileType.h"
|
#include "td/telegram/files/FileType.h"
|
||||||
#include "td/telegram/Global.h"
|
#include "td/telegram/Global.h"
|
||||||
#include "td/telegram/LanguagePackManager.h"
|
#include "td/telegram/LanguagePackManager.h"
|
||||||
@ -163,6 +166,25 @@ void MemoryManager::get_memory_stats(bool full, Promise<MemoryStats> promise) co
|
|||||||
td_->group_call_manager_->memory_stats(output);
|
td_->group_call_manager_->memory_stats(output);
|
||||||
output.push_back("}");
|
output.push_back("}");
|
||||||
|
|
||||||
|
output.push_back(",");
|
||||||
|
|
||||||
|
output.push_back("\"background_manager_\":{");
|
||||||
|
td_->background_manager_->memory_stats(output);
|
||||||
|
output.push_back("}");
|
||||||
|
|
||||||
|
output.push_back(",");
|
||||||
|
|
||||||
|
output.push_back("\"inline_queries_manager_\":{");
|
||||||
|
td_->inline_queries_manager_->memory_stats(output);
|
||||||
|
output.push_back("}");
|
||||||
|
|
||||||
|
|
||||||
|
output.push_back(",");
|
||||||
|
|
||||||
|
output.push_back("\"poll_manager_\":{");
|
||||||
|
td_->poll_manager_->memory_stats(output);
|
||||||
|
output.push_back("}");
|
||||||
|
|
||||||
output.push_back("}}");
|
output.push_back("}}");
|
||||||
|
|
||||||
string s;
|
string s;
|
||||||
@ -190,6 +212,9 @@ void MemoryManager::clean_memory(bool full, Promise<Unit> promise) const {
|
|||||||
td_->file_manager_->memory_cleanup();
|
td_->file_manager_->memory_cleanup();
|
||||||
td_->file_reference_manager_->memory_cleanup();
|
td_->file_reference_manager_->memory_cleanup();
|
||||||
td_->group_call_manager_->memory_cleanup();
|
td_->group_call_manager_->memory_cleanup();
|
||||||
|
td_->background_manager_->memory_cleanup();
|
||||||
|
td_->inline_queries_manager_->memory_cleanup();
|
||||||
|
td_->poll_manager_->memory_cleanup();
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#if defined(__GLIBC__) && !defined(__UCLIBC__) && !defined(__MUSL__)
|
#if defined(__GLIBC__) && !defined(__UCLIBC__) && !defined(__MUSL__)
|
||||||
|
@ -5924,6 +5924,10 @@ vector<int32> MessagesManager::get_scheduled_server_message_ids(const vector<Mes
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MessagesManager::memory_cleanup() {
|
void MessagesManager::memory_cleanup() {
|
||||||
|
memory_cleanup(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MessagesManager::memory_cleanup(bool full) {
|
||||||
/* CLEAR DELETED MESSAGES CACHE */
|
/* CLEAR DELETED MESSAGES CACHE */
|
||||||
{
|
{
|
||||||
auto it = dialogs_.begin();
|
auto it = dialogs_.begin();
|
||||||
@ -5945,6 +5949,9 @@ void MessagesManager::memory_cleanup() {
|
|||||||
found_on_server_dialogs_.rehash(0);
|
found_on_server_dialogs_.rehash(0);
|
||||||
full_message_id_to_file_source_id_.clear();
|
full_message_id_to_file_source_id_.clear();
|
||||||
full_message_id_to_file_source_id_.rehash(0);
|
full_message_id_to_file_source_id_.rehash(0);
|
||||||
|
if (full) {
|
||||||
|
dialogs_.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessagesManager::memory_stats(vector<string> &output) {
|
void MessagesManager::memory_stats(vector<string> &output) {
|
||||||
@ -11987,6 +11994,8 @@ class MessagesManager::DialogFiltersLogEvent {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void MessagesManager::tear_down() {
|
void MessagesManager::tear_down() {
|
||||||
|
// Completely clear memory when closing, to avoid memory leaks
|
||||||
|
memory_cleanup(true);
|
||||||
parent_.reset();
|
parent_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1734,6 +1734,8 @@ class MessagesManager : public Actor {
|
|||||||
|
|
||||||
static constexpr bool DROP_UPDATES = false;
|
static constexpr bool DROP_UPDATES = false;
|
||||||
|
|
||||||
|
void memory_cleanup(bool full);
|
||||||
|
|
||||||
static FullMessageId get_full_message_id(const tl_object_ptr<telegram_api::Message> &message_ptr, bool is_scheduled);
|
static FullMessageId get_full_message_id(const tl_object_ptr<telegram_api::Message> &message_ptr, bool is_scheduled);
|
||||||
|
|
||||||
static int32 get_message_date(const tl_object_ptr<telegram_api::Message> &message_ptr);
|
static int32 get_message_date(const tl_object_ptr<telegram_api::Message> &message_ptr);
|
||||||
|
@ -1689,4 +1689,39 @@ void PollManager::on_binlog_events(vector<BinlogEvent> &&events) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PollManager::memory_cleanup() {
|
||||||
|
// Completely clear memory when closing, to avoid memory leaks
|
||||||
|
memory_cleanup(true);
|
||||||
|
memory_cleanup(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PollManager::memory_cleanup(bool full) {
|
||||||
|
polls_.clear();
|
||||||
|
polls_.rehash(0);
|
||||||
|
poll_messages_.clear();
|
||||||
|
poll_messages_.rehash(0);
|
||||||
|
pending_answers_.clear();
|
||||||
|
pending_answers_.rehash(0);
|
||||||
|
poll_voters_.clear();
|
||||||
|
poll_voters_.rehash(0);
|
||||||
|
loaded_from_database_polls_.clear();
|
||||||
|
loaded_from_database_polls_.rehash(0);
|
||||||
|
being_closed_polls_.clear();
|
||||||
|
being_closed_polls_.rehash(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PollManager::memory_stats(vector<string> &output) {
|
||||||
|
output.push_back("\"polls_\":"); output.push_back(std::to_string(polls_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"poll_messages_\":"); output.push_back(std::to_string(poll_messages_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"pending_answers_\":"); output.push_back(std::to_string(pending_answers_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"poll_voters_\":"); output.push_back(std::to_string(poll_voters_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"loaded_from_database_polls_\":"); output.push_back(std::to_string(loaded_from_database_polls_.size()));
|
||||||
|
output.push_back(",");
|
||||||
|
output.push_back("\"being_closed_polls_\":"); output.push_back(std::to_string(being_closed_polls_.size()));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -43,6 +43,10 @@ class PollManager : public Actor {
|
|||||||
PollManager &operator=(PollManager &&) = delete;
|
PollManager &operator=(PollManager &&) = delete;
|
||||||
~PollManager() override;
|
~PollManager() override;
|
||||||
|
|
||||||
|
void memory_cleanup();
|
||||||
|
|
||||||
|
void memory_stats(vector<string> &output);
|
||||||
|
|
||||||
static bool is_local_poll_id(PollId poll_id);
|
static bool is_local_poll_id(PollId poll_id);
|
||||||
|
|
||||||
PollId create_poll(string &&question, vector<string> &&options, bool is_anonymous, bool allow_multiple_answers,
|
PollId create_poll(string &&question, vector<string> &&options, bool is_anonymous, bool allow_multiple_answers,
|
||||||
@ -141,6 +145,8 @@ class PollManager : public Actor {
|
|||||||
void start_up() override;
|
void start_up() override;
|
||||||
void tear_down() override;
|
void tear_down() override;
|
||||||
|
|
||||||
|
void memory_cleanup(bool full);
|
||||||
|
|
||||||
static void on_update_poll_timeout_callback(void *poll_manager_ptr, int64 poll_id_int);
|
static void on_update_poll_timeout_callback(void *poll_manager_ptr, int64 poll_id_int);
|
||||||
|
|
||||||
static void on_close_poll_timeout_callback(void *poll_manager_ptr, int64 poll_id_int);
|
static void on_close_poll_timeout_callback(void *poll_manager_ptr, int64 poll_id_int);
|
||||||
|
@ -1320,6 +1320,8 @@ void StickersManager::on_load_special_sticker_set(const SpecialStickerSetType &t
|
|||||||
}
|
}
|
||||||
|
|
||||||
void StickersManager::tear_down() {
|
void StickersManager::tear_down() {
|
||||||
|
// Completely clear memory when closing, to avoid memory leaks
|
||||||
|
memory_cleanup();
|
||||||
parent_.reset();
|
parent_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -405,6 +405,8 @@ WebPagesManager::WebPagesManager(Td *td, ActorShared<> parent) : td_(td), parent
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebPagesManager::tear_down() {
|
void WebPagesManager::tear_down() {
|
||||||
|
// Completely clear memory when closing, to avoid memory leaks
|
||||||
|
memory_cleanup();
|
||||||
parent_.reset();
|
parent_.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3795,6 +3795,10 @@ void FileManager::destroy_query(int32 file_id) {
|
|||||||
|
|
||||||
|
|
||||||
void FileManager::memory_cleanup() {
|
void FileManager::memory_cleanup() {
|
||||||
|
memory_cleanup(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FileManager::memory_cleanup(bool full) {
|
||||||
LOG(ERROR) << "Initial registered ids: " << file_id_info_.size() << " registered nodes: " << file_nodes_.size();
|
LOG(ERROR) << "Initial registered ids: " << file_id_info_.size() << " registered nodes: " << file_nodes_.size();
|
||||||
|
|
||||||
std::unordered_set<int32> file_to_be_deleted = {};
|
std::unordered_set<int32> file_to_be_deleted = {};
|
||||||
@ -3802,7 +3806,9 @@ void FileManager::memory_cleanup() {
|
|||||||
auto file_ttl = !G()->shared_config().get_option_integer("delete_file_reference_after_seconds", 30);
|
auto file_ttl = !G()->shared_config().get_option_integer("delete_file_reference_after_seconds", 30);
|
||||||
|
|
||||||
/* DESTROY OLD file_id_info_ */
|
/* DESTROY OLD file_id_info_ */
|
||||||
if (true) {
|
if (full) {
|
||||||
|
file_id_info_.clear();
|
||||||
|
} else {
|
||||||
auto it = file_id_info_.begin();
|
auto it = file_id_info_.begin();
|
||||||
auto time = std::time(nullptr);
|
auto time = std::time(nullptr);
|
||||||
|
|
||||||
@ -3868,7 +3874,7 @@ void FileManager::memory_cleanup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* DESTROY INVALID FILES */
|
/* DESTROY INVALID FILES */
|
||||||
if (true) {
|
if (!full) {
|
||||||
auto it = file_id_info_.begin();
|
auto it = file_id_info_.begin();
|
||||||
while (it != file_id_info_.end()) {
|
while (it != file_id_info_.end()) {
|
||||||
auto is_invalid = false;
|
auto is_invalid = false;
|
||||||
@ -3894,7 +3900,9 @@ void FileManager::memory_cleanup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* DESTROY INVALID file_nodes_ */
|
/* DESTROY INVALID file_nodes_ */
|
||||||
if (true) {
|
if (full) {
|
||||||
|
file_nodes_.clear();
|
||||||
|
} else {
|
||||||
auto it = file_nodes_.begin();
|
auto it = file_nodes_.begin();
|
||||||
while (it != file_nodes_.end()) {
|
while (it != file_nodes_.end()) {
|
||||||
auto is_invalid = false;
|
auto is_invalid = false;
|
||||||
@ -3931,7 +3939,9 @@ void FileManager::memory_cleanup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* DESTROY INVALID file_hash_to_file_id_ */
|
/* DESTROY INVALID file_hash_to_file_id_ */
|
||||||
if (true) {
|
if (full) {
|
||||||
|
file_hash_to_file_id_.clear();
|
||||||
|
} else {
|
||||||
auto it = file_hash_to_file_id_.begin();
|
auto it = file_hash_to_file_id_.begin();
|
||||||
while (it != file_hash_to_file_id_.end()) {
|
while (it != file_hash_to_file_id_.end()) {
|
||||||
auto is_invalid = false;
|
auto is_invalid = false;
|
||||||
@ -3957,7 +3967,9 @@ void FileManager::memory_cleanup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* DESTROY INVALID local_location_to_file_id_ */
|
/* DESTROY INVALID local_location_to_file_id_ */
|
||||||
if (true) {
|
if (full) {
|
||||||
|
local_location_to_file_id_.clear();
|
||||||
|
} else {
|
||||||
auto it = local_location_to_file_id_.begin();
|
auto it = local_location_to_file_id_.begin();
|
||||||
while (it != local_location_to_file_id_.end()) {
|
while (it != local_location_to_file_id_.end()) {
|
||||||
auto is_invalid = false;
|
auto is_invalid = false;
|
||||||
@ -3983,7 +3995,9 @@ void FileManager::memory_cleanup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* DESTROY INVALID generate_location_to_file_id_ */
|
/* DESTROY INVALID generate_location_to_file_id_ */
|
||||||
if (true) {
|
if (full) {
|
||||||
|
generate_location_to_file_id_.clear();
|
||||||
|
} else {
|
||||||
auto it = generate_location_to_file_id_.begin();
|
auto it = generate_location_to_file_id_.begin();
|
||||||
while (it != generate_location_to_file_id_.end()) {
|
while (it != generate_location_to_file_id_.end()) {
|
||||||
auto is_invalid = false;
|
auto is_invalid = false;
|
||||||
@ -4009,7 +4023,9 @@ void FileManager::memory_cleanup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* DESTROY INVALID remote_location_info_ */
|
/* DESTROY INVALID remote_location_info_ */
|
||||||
if (true) {
|
if (full) {
|
||||||
|
remote_location_info_.clear();
|
||||||
|
} else {
|
||||||
remote_location_info_.lock_access_mutex();
|
remote_location_info_.lock_access_mutex();
|
||||||
|
|
||||||
std::unordered_map<int32, RemoteInfo> old_remote_info = {};
|
std::unordered_map<int32, RemoteInfo> old_remote_info = {};
|
||||||
@ -4049,7 +4065,9 @@ void FileManager::memory_cleanup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* DESTROY NULL file_id_info_ */
|
/* DESTROY NULL file_id_info_ */
|
||||||
if (true) {
|
if (full) {
|
||||||
|
file_id_info_.clear();
|
||||||
|
} else {
|
||||||
auto it = file_id_info_.begin();
|
auto it = file_id_info_.begin();
|
||||||
while (it != file_id_info_.end()) {
|
while (it != file_id_info_.end()) {
|
||||||
auto is_invalid = false;
|
auto is_invalid = false;
|
||||||
@ -4072,9 +4090,11 @@ void FileManager::memory_cleanup() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!full) {
|
||||||
file_nodes_.rehash(file_nodes_.size() + 1);
|
file_nodes_.rehash(file_nodes_.size() + 1);
|
||||||
file_hash_to_file_id_.rehash(file_hash_to_file_id_.size() + 1);
|
file_hash_to_file_id_.rehash(file_hash_to_file_id_.size() + 1);
|
||||||
file_id_info_.rehash(file_id_info_.size() + 1);
|
file_id_info_.rehash(file_id_info_.size() + 1);
|
||||||
|
}
|
||||||
|
|
||||||
LOG(ERROR) << "Final registered ids: " << file_id_info_.size() << " registered nodes: " << file_nodes_.size();
|
LOG(ERROR) << "Final registered ids: " << file_id_info_.size() << " registered nodes: " << file_nodes_.size();
|
||||||
}
|
}
|
||||||
@ -4091,6 +4111,8 @@ void FileManager::memory_stats(vector<string> &output) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FileManager::tear_down() {
|
void FileManager::tear_down() {
|
||||||
|
// Completely clear memory when closing, to avoid memory leaks
|
||||||
|
memory_cleanup(true);
|
||||||
parent_.reset();
|
parent_.reset();
|
||||||
}
|
}
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
@ -506,6 +506,8 @@ class FileManager : public FileLoadManager::Callback {
|
|||||||
private:
|
private:
|
||||||
void destroy_query(int32 file_id);
|
void destroy_query(int32 file_id);
|
||||||
|
|
||||||
|
void memory_cleanup(bool full);
|
||||||
|
|
||||||
Result<FileId> check_input_file_id(FileType type, Result<FileId> result, bool is_encrypted, bool allow_zero,
|
Result<FileId> check_input_file_id(FileType type, Result<FileId> result, bool is_encrypted, bool allow_zero,
|
||||||
bool is_secure) TD_WARN_UNUSED_RESULT;
|
bool is_secure) TD_WARN_UNUSED_RESULT;
|
||||||
|
|
||||||
|
@ -24,6 +24,12 @@ class Enumerator {
|
|||||||
return map_;
|
return map_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clear() {
|
||||||
|
map_.clear();
|
||||||
|
arr_.clear();
|
||||||
|
next_id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
void lock_access_mutex() const {
|
void lock_access_mutex() const {
|
||||||
access_mutex.lock();
|
access_mutex.lock();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user