[LLD] Avoid exiting with a locked mutex NFC

In ErrorHandler::error(), rearrange code to avoid calling exitLld with
the mutex locked. Acquire mutex lock when flushing the output streams in
exitLld.

Differential Revision: https://reviews.llvm.org/D73281
This commit is contained in:
Andrew Ng 2020-01-22 17:08:09 +00:00
parent f117f2cc78
commit de2dfc8b20

View File

@ -62,8 +62,11 @@ void lld::exitLld(int val) {
// avoid intermittent crashes on Windows when exiting.
llvm_shutdown();
lld::outs().flush();
lld::errs().flush();
{
std::lock_guard<std::mutex> lock(mu);
lld::outs().flush();
lld::errs().flush();
}
_exit(val);
}
@ -191,20 +194,26 @@ void ErrorHandler::error(const Twine &msg) {
}
}
std::lock_guard<std::mutex> lock(mu);
bool exit = false;
{
std::lock_guard<std::mutex> lock(mu);
if (errorLimit == 0 || errorCount < errorLimit) {
lld::errs() << sep << getLocation(msg) << ": " << Colors::RED
<< "error: " << Colors::RESET << msg << "\n";
} else if (errorCount == errorLimit) {
lld::errs() << sep << getLocation(msg) << ": " << Colors::RED
<< "error: " << Colors::RESET << errorLimitExceededMsg << "\n";
if (exitEarly)
exitLld(1);
if (errorLimit == 0 || errorCount < errorLimit) {
lld::errs() << sep << getLocation(msg) << ": " << Colors::RED
<< "error: " << Colors::RESET << msg << "\n";
} else if (errorCount == errorLimit) {
lld::errs() << sep << getLocation(msg) << ": " << Colors::RED
<< "error: " << Colors::RESET << errorLimitExceededMsg
<< "\n";
exit = exitEarly;
}
sep = getSeparator(msg);
++errorCount;
}
sep = getSeparator(msg);
++errorCount;
if (exit)
exitLld(1);
}
void ErrorHandler::fatal(const Twine &msg) {