blob: 5777acbcfa620328c8bee2409161712f5cff1e4f [file] [log] [blame]
#include "host-common/GfxstreamFatalError.h"
#include <cstdlib>
#include <ostream>
#include "base/Metrics.h"
#include "host-common/logging.h"
namespace {
using android::base::CreateMetricsLogger;
using android::base::GfxstreamVkAbort;
std::optional<std::function<void()>> customDieFunction = std::nullopt;
#ifndef GFXSTREAM_TESTING
[[noreturn]]
#endif
void die() {
if (customDieFunction) {
(*customDieFunction)();
} else {
abort();
}
}
} // namespace
namespace emugl {
AbortMessage::AbortMessage(const char *file, const char *function, int line, FatalError reason)
: mFile(file), mFunction(function), mLine(line), mReason(reason) {
mOss << "FATAL in " << function << ", err code: " << reason.getAbortCode() << ": ";
}
AbortMessage::~AbortMessage() {
OutputLog(stderr, 'F', mFile, mLine, 0, mOss.str().c_str());
fflush(stderr);
CreateMetricsLogger()->logMetricEvent(GfxstreamVkAbort{.file = mFile,
.function = mFunction,
.msg = mOss.str().c_str(),
.line = mLine,
.abort_reason = mReason.getAbortCode()});
die();
}
void setDieFunction(std::optional<std::function<void()>> newDie) { customDieFunction = newDie; }
} // namespace emugl