diff --git a/td/telegram/Client.cpp b/td/telegram/Client.cpp index 78b8d9a1e..ae7efbf60 100644 --- a/td/telegram/Client.cpp +++ b/td/telegram/Client.cpp @@ -13,6 +13,7 @@ #include "td/utils/common.h" #include "td/utils/crypto.h" +#include "td/utils/ExitGuard.h" #include "td/utils/logging.h" #include "td/utils/misc.h" #include "td/utils/MpscPollableQueue.h" @@ -174,7 +175,7 @@ class ClientManager::Impl final { td.second.reset(); } } - while (!tds_.empty()) { + while (!tds_.empty() && !ExitGuard::is_exited()) { receive(10); } concurrent_scheduler_->finish(); @@ -521,7 +522,7 @@ class ClientManager::Impl final { for (auto &it : impls_) { close_impl(it.first); } - while (!impls_.empty()) { + while (!impls_.empty() && !ExitGuard::is_exited()) { receive(10); } } @@ -569,7 +570,7 @@ class Client::Impl final { Impl &operator=(Impl &&) = delete; ~Impl() { multi_impl_->close(td_id_); - while (true) { + while (!ExitGuard::is_exited()) { auto response = receiver_.receive(10.0); if (response.object == nullptr && response.client_id != 0 && response.request_id == 0) { break; diff --git a/td/telegram/ClientJson.cpp b/td/telegram/ClientJson.cpp index d5beab12d..8f946986a 100644 --- a/td/telegram/ClientJson.cpp +++ b/td/telegram/ClientJson.cpp @@ -10,6 +10,7 @@ #include "td/telegram/td_api_json.h" #include "td/utils/common.h" +#include "td/utils/ExitGuard.h" #include "td/utils/JsonBuilder.h" #include "td/utils/logging.h" #include "td/utils/port/thread_local.h" @@ -116,6 +117,7 @@ const char *ClientJson::execute(Slice request) { static ClientManager *get_manager() { static ClientManager client_manager; + static ExitGuard exit_guard; return &client_manager; } diff --git a/tdutils/td/utils/port/FileFd.cpp b/tdutils/td/utils/port/FileFd.cpp index 1a6965eca..634dacb64 100644 --- a/tdutils/td/utils/port/FileFd.cpp +++ b/tdutils/td/utils/port/FileFd.cpp @@ -12,6 +12,7 @@ #endif #include "td/utils/common.h" +#include "td/utils/ExitGuard.h" #include "td/utils/logging.h" #include "td/utils/misc.h" #include "td/utils/port/detail/PollableFd.h" @@ -356,6 +357,7 @@ Result FileFd::pread(MutableSlice slice, int64 offset) const { static std::mutex in_process_lock_mutex; static std::unordered_set locked_files; +static ExitGuard exit_guard; static Status create_local_lock(const string &path, int32 &max_tries) { while (true) { @@ -469,12 +471,13 @@ Status FileFd::lock(const LockFlags flags, const string &path, int32 max_tries) } void FileFd::remove_local_lock(const string &path) { - if (!path.empty()) { - VLOG(fd) << "Unlock file \"" << path << '"'; - std::unique_lock lock(in_process_lock_mutex); - auto erased_count = locked_files.erase(path); - CHECK(erased_count > 0); + if (path.empty() || ExitGuard::is_exited()) { + return; } + VLOG(fd) << "Unlock file \"" << path << '"'; + std::unique_lock lock(in_process_lock_mutex); + auto erased_count = locked_files.erase(path); + CHECK(erased_count > 0 || ExitGuard::is_exited()); } void FileFd::close() {