From bb1d0d244a3e80a5d1c4b2fc4c24d8036af72095 Mon Sep 17 00:00:00 2001 From: levlam Date: Wed, 26 Jul 2023 17:09:08 +0300 Subject: [PATCH] Optimize FileView const methods. --- td/telegram/files/FileManager.cpp | 86 ++++++++++++++++++------------- td/telegram/files/FileManager.h | 4 ++ 2 files changed, 53 insertions(+), 37 deletions(-) diff --git a/td/telegram/files/FileManager.cpp b/td/telegram/files/FileManager.cpp index df5e0d115..1184a19b8 100644 --- a/td/telegram/files/FileManager.cpp +++ b/td/telegram/files/FileManager.cpp @@ -595,21 +595,23 @@ int64 FileView::get_allocated_local_size() const { } int64 FileView::expected_size(bool may_guess) const { - if (node_->size_ != 0) { - return node_->size_; + const FileNode *file_node = node_.get(); + if (file_node->size_ != 0) { + return file_node->size_; } int64 current_size = local_total_size(); // TODO: this is not the best approximation - if (node_->expected_size_ != 0) { - return max(current_size, node_->expected_size_); + if (file_node->expected_size_ != 0) { + return max(current_size, file_node->expected_size_); } - if (may_guess && node_->local_.type() == LocalFileLocation::Type::Partial) { + if (may_guess && file_node->local_.type() == LocalFileLocation::Type::Partial) { current_size *= 3; } return current_size; } bool FileView::is_downloading() const { - return node_->download_priority_ != 0 || node_->generate_download_priority_ != 0; + const FileNode *file_node = node_.get(); + return file_node->download_priority_ != 0 || file_node->generate_download_priority_ != 0; } int64 FileView::download_offset() const { @@ -617,12 +619,13 @@ int64 FileView::download_offset() const { } int64 FileView::downloaded_prefix(int64 offset) const { - switch (node_->local_.type()) { + const FileNode *file_node = node_.get(); + switch (file_node->local_.type()) { case LocalFileLocation::Type::Empty: return 0; case LocalFileLocation::Type::Full: - if (offset < node_->size_) { - return node_->size_ - offset; + if (offset < file_node->size_) { + return file_node->size_ - offset; } return 0; case LocalFileLocation::Type::Partial: @@ -630,8 +633,8 @@ int64 FileView::downloaded_prefix(int64 offset) const { // File is not decrypted and verified yet return 0; } - return Bitmask(Bitmask::Decode{}, node_->local_.partial().ready_bitmask_) - .get_ready_prefix_size(offset, node_->local_.partial().part_size_, node_->size_); + return Bitmask(Bitmask::Decode{}, file_node->local_.partial().ready_bitmask_) + .get_ready_prefix_size(offset, file_node->local_.partial().part_size_, file_node->size_); default: UNREACHABLE(); return 0; @@ -639,30 +642,32 @@ int64 FileView::downloaded_prefix(int64 offset) const { } int64 FileView::local_prefix_size() const { - switch (node_->local_.type()) { + const FileNode *file_node = node_.get(); + switch (file_node->local_.type()) { case LocalFileLocation::Type::Full: - return node_->download_offset_ <= node_->size_ ? node_->size_ - node_->download_offset_ : 0; + return file_node->download_offset_ <= file_node->size_ ? file_node->size_ - file_node->download_offset_ : 0; case LocalFileLocation::Type::Partial: { if (is_encrypted_secure()) { // File is not decrypted and verified yet return 0; } - return node_->local_ready_prefix_size_; + return file_node->local_ready_prefix_size_; } default: return 0; } } int64 FileView::local_total_size() const { - switch (node_->local_.type()) { + const FileNode *file_node = node_.get(); + switch (file_node->local_.type()) { case LocalFileLocation::Type::Empty: return 0; case LocalFileLocation::Type::Full: - return node_->size_; + return file_node->size_; case LocalFileLocation::Type::Partial: - VLOG(update_file) << "Have local_ready_prefix_size = " << node_->local_ready_prefix_size_ - << " and local_ready_size = " << node_->local_ready_size_; - return max(node_->local_ready_prefix_size_, node_->local_ready_size_); + VLOG(update_file) << "Have local_ready_prefix_size = " << file_node->local_ready_prefix_size_ + << " and local_ready_size = " << file_node->local_ready_size_; + return max(file_node->local_ready_prefix_size_, file_node->local_ready_size_); default: UNREACHABLE(); return 0; @@ -670,17 +675,20 @@ int64 FileView::local_total_size() const { } bool FileView::is_uploading() const { - return node_->upload_priority_ != 0 || node_->generate_upload_priority_ != 0 || node_->upload_pause_.is_valid(); + const FileNode *file_node = node_.get(); + return file_node->upload_priority_ != 0 || file_node->generate_upload_priority_ != 0 || + file_node->upload_pause_.is_valid(); } int64 FileView::remote_size() const { - if (node_->remote_.is_full_alive) { - return node_->size_; + const FileNode *file_node = node_.get(); + if (file_node->remote_.is_full_alive) { + return file_node->size_; } - if (node_->remote_.partial) { - auto part_size = static_cast(node_->remote_.partial->part_size_); - auto ready_part_count = node_->remote_.partial->ready_part_count_; - auto remote_ready_size = node_->remote_.ready_size; + if (file_node->remote_.partial) { + auto part_size = static_cast(file_node->remote_.partial->part_size_); + auto ready_part_count = file_node->remote_.partial->ready_part_count_; + auto remote_ready_size = file_node->remote_.ready_size; VLOG(update_file) << "Have part_size = " << part_size << ", remote_ready_part_count = " << ready_part_count << ", remote_ready_size = " << remote_ready_size << ", size = " << size(); auto res = max(part_size * ready_part_count, remote_ready_size); @@ -689,15 +697,16 @@ int64 FileView::remote_size() const { } return res; } - return node_->remote_.ready_size; //??? + return file_node->remote_.ready_size; //??? } string FileView::path() const { - switch (node_->local_.type()) { + const FileNode *file_node = node_.get(); + switch (file_node->local_.type()) { case LocalFileLocation::Type::Full: - return node_->local_.full().path_; + return file_node->local_.full().path_; case LocalFileLocation::Type::Partial: - return node_->local_.partial().path_; + return file_node->local_.partial().path_; default: return string(); } @@ -3179,11 +3188,11 @@ td_api::object_ptr FileManager::get_file_object(FileId file_id, bo string persistent_file_id = file_node->get_persistent_file_id(); string unique_file_id = file_node->get_unique_file_id(); bool is_uploading_completed = !persistent_file_id.empty(); + auto size = file_node->size_; + auto download_offset = file_node->download_offset_; auto file_view = FileView(file_node_ptr); - auto size = file_view.size(); auto expected_size = file_view.expected_size(); - auto download_offset = file_view.download_offset(); auto local_prefix_size = file_view.local_prefix_size(); auto local_total_size = file_view.local_total_size(); auto remote_size = file_view.remote_size(); @@ -3193,15 +3202,17 @@ td_api::object_ptr FileManager::get_file_object(FileId file_id, bo auto result_file_id = file_id; auto *file_info = get_file_id_info(result_file_id); + FileId main_file_id; if (with_main_file_id) { + main_file_id = file_view.get_main_file_id(); if (!file_info->send_updates_flag_) { - result_file_id = file_view.get_main_file_id(); + result_file_id = main_file_id; } - file_info = get_file_id_info(file_view.get_main_file_id()); + file_info = get_file_id_info(main_file_id); } file_info->send_updates_flag_ = true; VLOG(update_file) << "Send file " << file_id << " as " << result_file_id << " and update send_updates_flag_ for file " - << (with_main_file_id ? file_view.get_main_file_id() : result_file_id); + << (with_main_file_id ? main_file_id : result_file_id); return td_api::make_object( result_file_id.get(), size, expected_size, @@ -3218,10 +3229,11 @@ vector FileManager::get_file_ids_object(const vector &file_ids, b auto result_file_id = file_id; auto *file_info = get_file_id_info(result_file_id); if (with_main_file_id) { + auto main_file_id = file_view.get_main_file_id(); if (!file_info->sent_file_id_flag_ && !file_info->send_updates_flag_) { - result_file_id = file_view.get_main_file_id(); + result_file_id = main_file_id; } - file_info = get_file_id_info(file_view.get_main_file_id()); + file_info = get_file_id_info(main_file_id); } file_info->sent_file_id_flag_ = true; diff --git a/td/telegram/files/FileManager.h b/td/telegram/files/FileManager.h index a96685674..341830fd2 100644 --- a/td/telegram/files/FileManager.h +++ b/td/telegram/files/FileManager.h @@ -248,6 +248,10 @@ class ConstFileNodePtr { return file_node_ptr_.get_remote(); } + const FileNode *get() const { + return file_node_ptr_.get(); + } + private: FileNodePtr file_node_ptr_; };