blob: 68bcb6b4c1dc41de4020ccc590538c4646f57e2c [file] [log] [blame]
#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