Commit de2dfc8b authored by Andrew Ng's avatar Andrew Ng
Browse files

[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
parent f117f2cc
Loading
Loading
Loading
Loading
+22 −13
Original line number Diff line number Diff line
@@ -62,8 +62,11 @@ void lld::exitLld(int val) {
  // avoid intermittent crashes on Windows when exiting.
  llvm_shutdown();

  {
    std::lock_guard<std::mutex> lock(mu);
    lld::outs().flush();
    lld::errs().flush();
  }
  _exit(val);
}

@@ -191,6 +194,8 @@ void ErrorHandler::error(const Twine &msg) {
    }
  }

  bool exit = false;
  {
    std::lock_guard<std::mutex> lock(mu);

    if (errorLimit == 0 || errorCount < errorLimit) {
@@ -198,15 +203,19 @@ void ErrorHandler::error(const Twine &msg) {
                  << "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);
                  << "error: " << Colors::RESET << errorLimitExceededMsg
                  << "\n";
      exit = exitEarly;
    }

    sep = getSeparator(msg);
    ++errorCount;
  }

  if (exit)
    exitLld(1);
}

void ErrorHandler::fatal(const Twine &msg) {
  error(msg);
  exitLld(1);