blob: 987ad4b4e6aa417791d01d8ef9068ceb3053d062 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "impeller/base/validation.h"
#include <atomic>
#include "flutter/fml/logging.h"
namespace impeller {
static std::atomic_int32_t sValidationLogsDisabledCount = 0;
static std::atomic_int32_t sValidationLogsAreFatal = 0;
static ValidationFailureCallback sValidationFailureCallback;
void ImpellerValidationErrorsSetFatal(bool fatal) {
sValidationLogsAreFatal = fatal;
}
void ImpellerValidationErrorsSetCallback(ValidationFailureCallback callback) {
sValidationFailureCallback = std::move(callback);
}
ScopedValidationDisable::ScopedValidationDisable() {
sValidationLogsDisabledCount++;
}
ScopedValidationDisable::~ScopedValidationDisable() {
sValidationLogsDisabledCount--;
}
ScopedValidationFatal::ScopedValidationFatal() {
sValidationLogsAreFatal++;
}
ScopedValidationFatal::~ScopedValidationFatal() {
sValidationLogsAreFatal--;
}
ValidationLog::ValidationLog(const char* file, int line)
: file_(file), line_(line) {}
ValidationLog::~ValidationLog() {
if (sValidationLogsDisabledCount <= 0) {
ImpellerValidationBreak(stream_.str().c_str(), file_, line_);
}
}
std::ostream& ValidationLog::GetStream() {
return stream_;
}
void ImpellerValidationBreak(const char* message, const char* file, int line) {
if (sValidationFailureCallback &&
sValidationFailureCallback(message, file, line)) {
return;
}
const auto severity =
ImpellerValidationErrorsAreFatal() ? fml::LOG_FATAL : fml::LOG_ERROR;
auto fml_log = fml::LogMessage{severity, file, line, nullptr};
fml_log.stream() <<
#if FLUTTER_RELEASE
"Impeller validation: " << message;
#else // FLUTTER_RELEASE
"Break on '" << __FUNCTION__
<< "' to inspect point of failure: " << message;
#endif // FLUTTER_RELEASE
}
bool ImpellerValidationErrorsAreFatal() {
return sValidationLogsAreFatal;
}
} // namespace impeller