pytorch/c10/util/ThreadLocalDebugInfo.cpp
Nikita Shulga a9b0a921d5 Disable avoid-non-const-global-variables lint check (#62008)
Summary:
As GoogleTest `TEST` macro is non-compliant with it as well as `DEFINE_DISPATCH`

All changes but the ones to `.clang-tidy` are generated using following script:
```
for i in `find . -type f -iname "*.c*" -or -iname "*.h"|xargs grep cppcoreguidelines-avoid-non-const-global-variables|cut -f1 -d:|sort|uniq`;  do sed -i "/\/\/ NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)/d" $i; done
```

Pull Request resolved: https://github.com/pytorch/pytorch/pull/62008

Reviewed By: driazati, r-barnes

Differential Revision: D29838584

Pulled By: malfet

fbshipit-source-id: 1b2f8602c945bd4ce50a9bfdd204755556e31d13
2021-07-22 18:04:40 -07:00

93 lines
2.2 KiB
C++

#include <c10/util/ThreadLocal.h>
#include <c10/util/ThreadLocalDebugInfo.h>
namespace c10 {
C10_DEFINE_TLS_static(std::shared_ptr<ThreadLocalDebugInfo>, tls_debug_info);
#define debug_info (tls_debug_info.get())
/* static */
DebugInfoBase* ThreadLocalDebugInfo::get(DebugInfoKind kind) {
ThreadLocalDebugInfo* cur = debug_info.get();
while (cur) {
if (cur->kind_ == kind) {
return cur->info_.get();
}
cur = cur->parent_info_.get();
}
return nullptr;
}
/* static */
std::shared_ptr<ThreadLocalDebugInfo> ThreadLocalDebugInfo::current() {
return debug_info;
}
/* static */
void ThreadLocalDebugInfo::_forceCurrentDebugInfo(
const std::shared_ptr<ThreadLocalDebugInfo>& info) {
debug_info = info;
}
/* static */
void ThreadLocalDebugInfo::_push(
DebugInfoKind kind,
std::shared_ptr<DebugInfoBase> info) {
auto prev_info = debug_info;
debug_info = std::make_shared<ThreadLocalDebugInfo>();
debug_info->parent_info_ = prev_info;
debug_info->kind_ = kind;
debug_info->info_ = info;
}
/* static */
std::shared_ptr<DebugInfoBase> ThreadLocalDebugInfo::_pop(DebugInfoKind kind) {
TORCH_CHECK(
debug_info && debug_info->kind_ == kind,
"Expected debug info of type ",
(size_t)kind);
auto res = debug_info;
debug_info = debug_info->parent_info_;
return res->info_;
}
/* static */
std::shared_ptr<DebugInfoBase> ThreadLocalDebugInfo::_peek(DebugInfoKind kind) {
TORCH_CHECK(
debug_info && debug_info->kind_ == kind,
"Expected debug info of type ",
(size_t)kind);
return debug_info->info_;
}
DebugInfoGuard::DebugInfoGuard(
DebugInfoKind kind,
std::shared_ptr<DebugInfoBase> info) {
if (!info) {
return;
}
prev_info_ = debug_info;
ThreadLocalDebugInfo::_push(kind, info);
active_ = true;
}
DebugInfoGuard::~DebugInfoGuard() {
if (active_) {
debug_info = prev_info_;
}
}
// Used only for setting a debug info after crossing the thread boundary;
// in this case we assume that thread pool's thread does not have an
// active debug info
DebugInfoGuard::DebugInfoGuard(std::shared_ptr<ThreadLocalDebugInfo> info) {
if (!info) {
return;
}
prev_info_ = debug_info;
debug_info = info;
active_ = true;
}
} // namespace c10