| #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 |