Protect access to some static variables using ExitGuard.

GitOrigin-RevId: 65c7510c60d585b90e90d09067c7dfdaf79c4cd3
This commit is contained in:
levlam 2020-10-11 01:59:27 +03:00
parent 7207d76a80
commit 09f906f192
3 changed files with 14 additions and 8 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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<size_t> FileFd::pread(MutableSlice slice, int64 offset) const {
static std::mutex in_process_lock_mutex;
static std::unordered_set<string> 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<std::mutex> 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<std::mutex> lock(in_process_lock_mutex);
auto erased_count = locked_files.erase(path);
CHECK(erased_count > 0 || ExitGuard::is_exited());
}
void FileFd::close() {