blob: b51dc1cfa80c28374c941694b24ca6c9aee9a85e [file] [log] [blame]
John Park398c74a2018-10-20 21:17:39 -07001#include "aos/init.h"
brians343bc112013-02-10 01:53:46 +00002
brians343bc112013-02-10 01:53:46 +00003#include <sched.h>
Tyler Chatowbf0609c2021-07-31 16:13:27 -07004#include <sys/mman.h>
brians343bc112013-02-10 01:53:46 +00005#include <sys/resource.h>
brians343bc112013-02-10 01:53:46 +00006#include <sys/types.h>
7#include <unistd.h>
Tyler Chatowbf0609c2021-07-31 16:13:27 -07008
9#include <cerrno>
10#include <cstdio>
11#include <cstdlib>
12#include <cstring>
brians343bc112013-02-10 01:53:46 +000013
Austin Schuh99f7c6a2024-06-25 22:07:44 -070014#include "absl/debugging/failure_signal_handler.h"
15#include "absl/debugging/symbolize.h"
16#include "absl/flags/flag.h"
17#include "absl/flags/parse.h"
18#include "absl/log/check.h"
19#include "absl/log/flags.h"
20#include "absl/log/globals.h"
21#include "absl/log/initialize.h"
22#include "absl/log/log.h"
Brian Silverman40486622014-12-30 17:38:55 -080023
Philipp Schrader790cb542023-07-05 21:06:52 -070024#include "aos/realtime.h"
James Kuszmaula791b762023-07-13 14:56:21 -070025#include "aos/uuid.h"
Philipp Schrader790cb542023-07-05 21:06:52 -070026
Austin Schuh99f7c6a2024-06-25 22:07:44 -070027ABSL_FLAG(bool, coredump, false, "If true, write core dumps on failure.");
28ABSL_FLAG(bool, backtrace, true, "If true, print backtraces out on crashes.");
Austin Schuh707c8352020-03-15 14:27:25 -070029
brians343bc112013-02-10 01:53:46 +000030namespace aos {
brians343bc112013-02-10 01:53:46 +000031namespace {
Austin Schuh99f7c6a2024-06-25 22:07:44 -070032std::atomic<bool> initialized{false};
Austin Schuh3d4d5df2015-10-17 15:51:41 -070033} // namespace
34
Austin Schuh094d09b2020-11-20 23:26:52 -080035bool IsInitialized() { return initialized; }
36
Alex Perrycb7da4b2019-08-28 19:35:56 -070037void InitGoogle(int *argc, char ***argv) {
Austin Schuh094d09b2020-11-20 23:26:52 -080038 CHECK(!IsInitialized()) << "Only initialize once.";
Austin Schuh99f7c6a2024-06-25 22:07:44 -070039 absl::SetStderrThreshold(absl::LogSeverityAtLeast::kInfo);
40 std::vector<char *> positional_arguments =
41 absl::ParseCommandLine(*argc, *argv);
Austin Schuh62288252020-11-18 23:26:04 -080042
Austin Schuh99f7c6a2024-06-25 22:07:44 -070043 {
44 const std::vector<absl::UnrecognizedFlag> unrecognized_flags;
45 absl::ReportUnrecognizedFlags(unrecognized_flags);
46 if (!unrecognized_flags.empty()) {
47 for (const absl::UnrecognizedFlag &flag : unrecognized_flags) {
48 LOG(ERROR) << "Unrecognized flag " << flag.flag_name;
49 }
50 LOG(FATAL) << "Found unrecognized flags, aborting";
51 }
52 }
53
54 CHECK_LE(positional_arguments.size(), static_cast<size_t>(*argc));
55 for (size_t i = 0; i < positional_arguments.size(); ++i) {
56 (*argv)[i] = positional_arguments[i];
57 }
58 *argc = positional_arguments.size();
59
60 absl::InitializeLog();
61
62 if (absl::GetFlag(FLAGS_backtrace)) {
63 absl::InitializeSymbolizer((*argv)[0]);
64 absl::FailureSignalHandlerOptions options;
65 absl::InstallFailureSignalHandler(options);
66 }
67
68 if (absl::GetFlag(FLAGS_coredump)) {
Austin Schuh094d09b2020-11-20 23:26:52 -080069 WriteCoreDumps();
brians343bc112013-02-10 01:53:46 +000070 }
71
Austin Schuh094d09b2020-11-20 23:26:52 -080072 RegisterMallocHook();
James Kuszmaula791b762023-07-13 14:56:21 -070073 // Ensure that the random number generator for the UUID code is initialized
74 // (it does some potentially expensive random number generation).
75 UUID::Random();
76
Austin Schuh094d09b2020-11-20 23:26:52 -080077 initialized = true;
Brian Silvermane4d8b282015-12-24 13:44:48 -080078}
79
Adam Snaider48a62f32023-10-02 15:49:23 -070080void MarkInitialized() { initialized = true; }
Brian Silvermane4c79ce2022-08-15 05:57:28 -070081
brians343bc112013-02-10 01:53:46 +000082} // namespace aos