| #include "quiche/common/bug_utils.h" | |
| #include <atomic> | |
| #include <cstdint> | |
| #include <limits> | |
| #include <string> | |
| #include "absl/base/log_severity.h" | |
| #include "absl/strings/str_cat.h" | |
| #include "absl/strings/string_view.h" | |
| namespace quiche { | |
| namespace internal { | |
| GenericBugStreamHandler::GenericBugStreamHandler( | |
| const char* prefix, const char* bug_id, const GenericBugOptions& options) | |
| : bug_id_(bug_id), options_(options) { | |
| if (options_.condition_str.empty()) { | |
| absl::StrAppend(&str_, prefix, "(", bug_id, "): "); | |
| } else { | |
| absl::StrAppend(&str_, prefix, "_IF(", bug_id, ", ", options_.condition_str, | |
| "): "); | |
| } | |
| } | |
| GenericBugStreamHandler::~GenericBugStreamHandler() { | |
| GenericBugStreamHandler::OverrideFunction override_function = | |
| GetOverrideFunction(); | |
| if (options_.bug_listener != nullptr) { | |
| options_.bug_listener->OnBug(bug_id_, options_.file_name, options_.line, | |
| str_); | |
| } | |
| if (override_function != nullptr) { | |
| override_function(options_.severity, options_.file_name, options_.line, | |
| str_); | |
| } | |
| } | |
| // static | |
| void GenericBugStreamHandler::SetOverrideFunction( | |
| GenericBugStreamHandler::OverrideFunction override_function) { | |
| atomic_override_function_.store(override_function); | |
| } | |
| // static | |
| GenericBugStreamHandler::OverrideFunction | |
| GenericBugStreamHandler::GetOverrideFunction() { | |
| return atomic_override_function_.load(std::memory_order_relaxed); | |
| } | |
| // static | |
| std::atomic<GenericBugStreamHandler::OverrideFunction> | |
| GenericBugStreamHandler::atomic_override_function_ = nullptr; | |
| void GenericBugWithoutLog(const char* bug_id, | |
| const GenericBugOptions& options) { | |
| if (options.bug_listener != nullptr) { | |
| options.bug_listener->OnBug(bug_id, options.file_name, options.line, | |
| /*No bug message*/ ""); | |
| } | |
| } | |
| } // namespace internal | |
| } // namespace quiche |