Skip to content

Commit

Permalink
Fix thread_local initializtion in C10 WarningHandler. (#34822)
Browse files Browse the repository at this point in the history
Summary:
The Windows + MSVC-specific bug discussed here: #19394 and fixed here: #22405 still appears in C10's warning handler class. This results in a crash if a user attempts to run code which would print a warning when that code is running inside a thread created by a DLL. This PR applies a similar fix to that of #22405.
Pull Request resolved: #34822

Test Plan:
* Tested locally by running CodecverseWorkbench Unity app with patched build.
* CI

Differential Revision: D20627971

Pulled By: HapeMask

fbshipit-source-id: 64dfca531ed7eebbe9e0ecac3d3d4d025c683883
  • Loading branch information
HapeMask authored and facebook-github-bot committed Mar 25, 2020
1 parent f090031 commit d6377b7
Showing 1 changed file with 25 additions and 5 deletions.
30 changes: 25 additions & 5 deletions c10/util/Exception.cpp
Expand Up @@ -66,24 +66,44 @@ void Error::AppendMessage(const std::string& new_msg) {
namespace Warning {

namespace {
WarningHandler* getHandler() {
WarningHandler* getBaseHandler() {
static WarningHandler base_warning_handler_ = WarningHandler();
return &base_warning_handler_;
};
static thread_local WarningHandler* warning_handler_ = getHandler();

class ThreadWarningHandler {
public:
ThreadWarningHandler() = delete;

static WarningHandler* get_handler() {
if (!warning_handler_) {
warning_handler_ = getBaseHandler();
}
return warning_handler_;
}

static void set_handler(WarningHandler* handler) {
warning_handler_ = handler;
}

private:
static thread_local WarningHandler* warning_handler_;
};

thread_local WarningHandler* ThreadWarningHandler::warning_handler_ = nullptr;

}

void warn(SourceLocation source_location, const std::string& msg) {
warning_handler_->process(source_location, msg);
ThreadWarningHandler::get_handler()->process(source_location, msg);
}

void set_warning_handler(WarningHandler* handler) noexcept(true) {
warning_handler_ = handler;
ThreadWarningHandler::set_handler(handler);
}

WarningHandler* get_warning_handler() noexcept(true) {
return warning_handler_;
return ThreadWarningHandler::get_handler();
}

} // namespace Warning
Expand Down

0 comments on commit d6377b7

Please sign in to comment.