| Flutter Impeller |

validation.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "impeller/base/validation.h"
6
7 #include <atomic>
8
9 #include "flutter/fml/logging.h"
10
11 namespace impeller {
12
13 static std::atomic_int32_t sValidationLogsDisabledCount = 0;
14 static std::atomic_int32_t sValidationLogsAreFatal = 0;
15 static ValidationFailureCallback sValidationFailureCallback;
16
17 void ImpellerValidationErrorsSetFatal(bool fatal) {
18 sValidationLogsAreFatal = fatal;
19 }
20
21 void ImpellerValidationErrorsSetCallback(ValidationFailureCallback callback) {
22 sValidationFailureCallback = std::move(callback);
23 }
24
25 ScopedValidationDisable::ScopedValidationDisable() {
26 sValidationLogsDisabledCount++;
27 }
28
29 ScopedValidationDisable::~ScopedValidationDisable() {
30 sValidationLogsDisabledCount--;
31 }
32
33 ScopedValidationFatal::ScopedValidationFatal() {
34 sValidationLogsAreFatal++;
35 }
36
37 ScopedValidationFatal::~ScopedValidationFatal() {
38 sValidationLogsAreFatal--;
39 }
40
41 ValidationLog::ValidationLog(const char* file, int line)
42 : file_(file), line_(line) {}
43
44 ValidationLog::~ValidationLog() {
45 if (sValidationLogsDisabledCount <= 0) {
46 ImpellerValidationBreak(stream_.str().c_str(), file_, line_);
47 }
48 }
49
50 std::ostream& ValidationLog::GetStream() {
51 return stream_;
52 }
53
54 void ImpellerValidationBreak(const char* message, const char* file, int line) {
55 if (sValidationFailureCallback &&
56 sValidationFailureCallback(message, file, line)) {
57 return;
58 }
59 const auto severity =
60 ImpellerValidationErrorsAreFatal() ? fml::LOG_FATAL : fml::LOG_ERROR;
61 auto fml_log = fml::LogMessage{severity, file, line, nullptr};
62 fml_log.stream() <<
63 #if FLUTTER_RELEASE
64 "Impeller validation: " << message;
65 #else // FLUTTER_RELEASE
66 "Break on '" << __FUNCTION__
67 << "' to inspect point of failure: " << message;
68 #endif // FLUTTER_RELEASE
69 }
70
71 bool ImpellerValidationErrorsAreFatal() {
72 return sValidationLogsAreFatal;
73 }
74
75 } // namespace impeller
impeller::ValidationLog::ValidationLog
ValidationLog(const char *file, int line)
Definition: validation.cc:41
impeller::ValidationLog::~ValidationLog
~ValidationLog()
Definition: validation.cc:44
impeller::ValidationLog::GetStream
std::ostream & GetStream()
Definition: validation.cc:50
impeller
Definition: allocation.cc:12
impeller::ValidationFailureCallback
std::function< bool(const char *message, const char *file, int line)> ValidationFailureCallback
Definition: validation.h:42
impeller::ImpellerValidationBreak
void ImpellerValidationBreak(const char *message, const char *file, int line)
Definition: validation.cc:54
impeller::sValidationFailureCallback
static ValidationFailureCallback sValidationFailureCallback
Definition: validation.cc:15
impeller::ImpellerValidationErrorsSetCallback
void ImpellerValidationErrorsSetCallback(ValidationFailureCallback callback)
Sets a callback that callers (usually tests) can set to intercept validation failures.
Definition: validation.cc:21
impeller::ImpellerValidationErrorsAreFatal
bool ImpellerValidationErrorsAreFatal()
Definition: validation.cc:71
impeller::sValidationLogsAreFatal
static std::atomic_int32_t sValidationLogsAreFatal
Definition: validation.cc:14
impeller::ImpellerValidationErrorsSetFatal
void ImpellerValidationErrorsSetFatal(bool fatal)
Definition: validation.cc:17
impeller::sValidationLogsDisabledCount
static std::atomic_int32_t sValidationLogsDisabledCount
Definition: validation.cc:13
impeller::ScopedValidationDisable::~ScopedValidationDisable
~ScopedValidationDisable()
Definition: validation.cc:29
impeller::ScopedValidationDisable::ScopedValidationDisable
ScopedValidationDisable()
Definition: validation.cc:25
impeller::ScopedValidationFatal::~ScopedValidationFatal
~ScopedValidationFatal()
Definition: validation.cc:37
impeller::ScopedValidationFatal::ScopedValidationFatal
ScopedValidationFatal()
Definition: validation.cc:33
validation.h