#include "llvm/Support/raw_ostream.h"
#include <cassert>
#include <cstdlib>
+#include <mutex>
#if defined(HAVE_UNISTD_H)
# include <unistd.h>
static fatal_error_handler_t ErrorHandler = nullptr;
static void *ErrorHandlerUserData = nullptr;
+static llvm::recursive_mutex ErrorHandlerMutex;
+
void llvm::install_fatal_error_handler(fatal_error_handler_t handler,
void *user_data) {
- assert(!llvm_is_multithreaded() &&
- "Cannot register error handlers after starting multithreaded mode!\n");
+ std::lock_guard<llvm::recursive_mutex> Lock(ErrorHandlerMutex);
assert(!ErrorHandler && "Error handler already registered!\n");
ErrorHandler = handler;
ErrorHandlerUserData = user_data;
}
void llvm::remove_fatal_error_handler() {
+ std::lock_guard<llvm::recursive_mutex> Lock(ErrorHandlerMutex);
ErrorHandler = nullptr;
}
}
void llvm::report_fatal_error(const Twine &Reason, bool GenCrashDiag) {
+ std::lock_guard<llvm::recursive_mutex> Lock(ErrorHandlerMutex);
if (ErrorHandler) {
ErrorHandler(ErrorHandlerUserData, Reason.str(), GenCrashDiag);
} else {