blob: b51dc1cfa80c28374c941694b24ca6c9aee9a85e [file] [log] [blame]
#include "aos/init.h"
#include <sched.h>
#include <sys/mman.h>
#include <sys/resource.h>
#include <sys/types.h>
#include <unistd.h>
#include <cerrno>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include "absl/debugging/failure_signal_handler.h"
#include "absl/debugging/symbolize.h"
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "absl/log/check.h"
#include "absl/log/flags.h"
#include "absl/log/globals.h"
#include "absl/log/initialize.h"
#include "absl/log/log.h"
#include "aos/realtime.h"
#include "aos/uuid.h"
ABSL_FLAG(bool, coredump, false, "If true, write core dumps on failure.");
ABSL_FLAG(bool, backtrace, true, "If true, print backtraces out on crashes.");
namespace aos {
namespace {
std::atomic<bool> initialized{false};
} // namespace
bool IsInitialized() { return initialized; }
void InitGoogle(int *argc, char ***argv) {
CHECK(!IsInitialized()) << "Only initialize once.";
absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfo);
std::vector<char *> positional_arguments =
absl::ParseCommandLine(*argc, *argv);
{
const std::vector<absl::UnrecognizedFlag> unrecognized_flags;
absl::ReportUnrecognizedFlags(unrecognized_flags);
if (!unrecognized_flags.empty()) {
for (const absl::UnrecognizedFlag &flag : unrecognized_flags) {
LOG(ERROR) << "Unrecognized flag " << flag.flag_name;
}
LOG(FATAL) << "Found unrecognized flags, aborting";
}
}
CHECK_LE(positional_arguments.size(), static_cast<size_t>(*argc));
for (size_t i = 0; i < positional_arguments.size(); ++i) {
(*argv)[i] = positional_arguments[i];
}
*argc = positional_arguments.size();
absl::InitializeLog();
if (absl::GetFlag(FLAGS_backtrace)) {
absl::InitializeSymbolizer((*argv)[0]);
absl::FailureSignalHandlerOptions options;
absl::InstallFailureSignalHandler(options);
}
if (absl::GetFlag(FLAGS_coredump)) {
WriteCoreDumps();
}
RegisterMallocHook();
// Ensure that the random number generator for the UUID code is initialized
// (it does some potentially expensive random number generation).
UUID::Random();
initialized = true;
}
void MarkInitialized() { initialized = true; }
} // namespace aos