diff --git a/tdutils/td/utils/port/StdStreams.cpp b/tdutils/td/utils/port/StdStreams.cpp index 30603e1de..ef903bf72 100644 --- a/tdutils/td/utils/port/StdStreams.cpp +++ b/tdutils/td/utils/port/StdStreams.cpp @@ -24,7 +24,8 @@ namespace td { template static FileFd &get_file_fd() { static FileFd result = FileFd::from_native_fd(NativeFd(id, true)); - static auto guard = ScopeExit() + [&] { + static ExitGuard exit_guard; + static auto guard = SCOPE_EXIT { result.move_as_native_fd().release(); }; return result; diff --git a/tdutils/td/utils/port/detail/PollableFd.h b/tdutils/td/utils/port/detail/PollableFd.h index d8a0d8d7c..e03e00cd8 100644 --- a/tdutils/td/utils/port/detail/PollableFd.h +++ b/tdutils/td/utils/port/detail/PollableFd.h @@ -7,6 +7,7 @@ #pragma once #include "td/utils/common.h" +#include "td/utils/ExitGuard.h" #include "td/utils/format.h" #include "td/utils/List.h" #include "td/utils/logging.h" @@ -124,8 +125,10 @@ class PollableFdInfo : private ListNode { ~PollableFdInfo() { VLOG(fd) << native_fd() << " destroy PollableFdInfo"; - bool was_locked = lock_.test_and_set(std::memory_order_acquire); - CHECK(!was_locked); + if (!ExitGuard::is_exited()) { + bool was_locked = lock_.test_and_set(std::memory_order_acquire); + CHECK(!was_locked); + } } void add_flags_from_poll(PollFlags flags) {