1 #include "host-common/GfxstreamFatalError.h"
2
3 #include <cstdlib>
4 #include <ostream>
5
6 #include "base/Metrics.h"
7 #include "host-common/logging.h"
8
9 namespace {
10
11 using android::base::CreateMetricsLogger;
12 using android::base::GfxstreamVkAbort;
13
14 std::optional<std::function<void()>> customDieFunction = std::nullopt;
15
die()16 [[noreturn]] void die() {
17 if (customDieFunction) {
18 (*customDieFunction)();
19 }
20 abort();
21 }
22
23 } // namespace
24
25 namespace emugl {
26
AbortMessage(const char * file,const char * function,int line,FatalError reason)27 AbortMessage::AbortMessage(const char *file, const char *function, int line, FatalError reason)
28 : mFile(file), mFunction(function), mLine(line), mReason(reason) {
29 mOss << "FATAL in " << function << ", err code: " << reason.getAbortCode() << ": ";
30 }
31
~AbortMessage()32 AbortMessage::~AbortMessage() {
33 OutputLog(stderr, 'F', mFile, mLine, 0, mOss.str().c_str());
34 fflush(stderr);
35 CreateMetricsLogger()->logMetricEvent(GfxstreamVkAbort{.file = mFile,
36 .function = mFunction,
37 .msg = mOss.str().c_str(),
38 .line = mLine,
39 .abort_reason = mReason.getAbortCode()});
40
41 die();
42 }
43
setDieFunction(std::optional<std::function<void ()>> newDie)44 void setDieFunction(std::optional<std::function<void()>> newDie) { customDieFunction = newDie; }
45 } // namespace emugl
46