blob: ac18413783c196d96baea2cd786039b0706c441b [file] [log] [blame]
John Park398c74a2018-10-20 21:17:39 -07001#include "aos/init.h"
brians343bc112013-02-10 01:53:46 +00002
3#include <stdio.h>
4#include <string.h>
5#include <sys/mman.h>
6#include <errno.h>
7#include <sched.h>
8#include <sys/resource.h>
brians343bc112013-02-10 01:53:46 +00009#include <sys/types.h>
10#include <unistd.h>
11#include <stdlib.h>
12#include <stdint.h>
Brian Silverman2fe007c2014-12-28 12:20:01 -080013#include <sys/prctl.h>
Brian Silverman40486622014-12-30 17:38:55 -080014#include <malloc.h>
brians343bc112013-02-10 01:53:46 +000015
John Park33858a32018-09-28 23:05:48 -070016#include "aos/die.h"
John Park398c74a2018-10-20 21:17:39 -070017#include "aos/ipc_lib/shared_mem.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -070018#include "aos/logging/implementations.h"
19#include "aos/realtime.h"
brians343bc112013-02-10 01:53:46 +000020
Brian Silverman40486622014-12-30 17:38:55 -080021namespace FLAG__namespace_do_not_use_directly_use_DECLARE_double_instead {
Brian Silverman26438442015-10-11 19:36:47 -040022extern double FLAGS_tcmalloc_release_rate __attribute__((weak));
Brian Silverman40486622014-12-30 17:38:55 -080023}
24using FLAG__namespace_do_not_use_directly_use_DECLARE_double_instead::
25 FLAGS_tcmalloc_release_rate;
Brian Silverman40486622014-12-30 17:38:55 -080026
brians343bc112013-02-10 01:53:46 +000027namespace aos {
Brian Silverman2fe007c2014-12-28 12:20:01 -080028namespace logging {
29namespace internal {
brians343bc112013-02-10 01:53:46 +000030
John Park33858a32018-09-28 23:05:48 -070031// Implemented in aos/logging/context.cc.
Brian Silverman2fe007c2014-12-28 12:20:01 -080032void ReloadThreadName();
33
34} // namespace internal
35} // namespace logging
brians343bc112013-02-10 01:53:46 +000036namespace {
37
brians343bc112013-02-10 01:53:46 +000038// Common stuff that needs to happen at the beginning of both the realtime and
39// non-realtime initialization sequences. May be called twice.
40void InitStart() {
Brian Silvermanff485782014-06-18 19:59:09 -070041 ::aos::logging::Init();
Brian Silvermanfe1ef172014-04-12 17:12:45 -070042 WriteCoreDumps();
brians343bc112013-02-10 01:53:46 +000043}
44
Austin Schuh3d4d5df2015-10-17 15:51:41 -070045const char *const kNoRealtimeEnvironmentVariable = "AOS_NO_REALTIME";
46
Brian Silverman8f8debf2018-03-11 19:30:23 -070047bool ShouldBeRealtime() {
48 return getenv(kNoRealtimeEnvironmentVariable) == nullptr;
49}
50
Austin Schuh3d4d5df2015-10-17 15:51:41 -070051} // namespace
52
Alex Perrycb7da4b2019-08-28 19:35:56 -070053void InitGoogle(int *argc, char ***argv) {
54 FLAGS_logtostderr = true;
55 google::InitGoogleLogging((*argv)[0]);
56 gflags::ParseCommandLineFlags(argc, argv, true);
57 google::InstallFailureSignalHandler();
brians343bc112013-02-10 01:53:46 +000058}
59
Brian Silverman8f8debf2018-03-11 19:30:23 -070060void InitNRT(bool for_realtime) {
Brian Silverman8a6dac92015-02-21 20:08:24 -050061 InitStart();
Brian Silverman8f8debf2018-03-11 19:30:23 -070062 aos_core_create_shared_mem(false, for_realtime && ShouldBeRealtime());
Brian Silvermancb5da1f2015-12-05 22:19:58 -050063 logging::RegisterQueueImplementation();
Austin Schuhf257f3c2019-10-27 21:00:43 -070064 AOS_LOG(INFO, "%s initialized non-realtime\n", program_invocation_short_name);
Brian Silverman8a6dac92015-02-21 20:08:24 -050065}
66
67void InitCreate() {
68 InitStart();
69 aos_core_create_shared_mem(true, false);
Brian Silvermancb5da1f2015-12-05 22:19:58 -050070 logging::RegisterQueueImplementation();
Austin Schuhf257f3c2019-10-27 21:00:43 -070071 AOS_LOG(INFO, "%s created shm\n", program_invocation_short_name);
Brian Silverman8a6dac92015-02-21 20:08:24 -050072}
73
Brian Silvermanf3cfbd72013-10-28 16:26:09 -070074void Init(int relative_priority) {
Brian Silverman8f8debf2018-03-11 19:30:23 -070075 InitStart();
76 aos_core_create_shared_mem(false, ShouldBeRealtime());
77 logging::RegisterQueueImplementation();
78 GoRT(relative_priority);
79}
80
81void GoRT(int relative_priority) {
82 if (ShouldBeRealtime()) {
Austin Schuh9fe68f72019-08-10 19:32:03 -070083 InitRT();
Brian Silverman6da04272014-05-18 18:47:48 -070084
85 // Set our process to the appropriate priority.
brians343bc112013-02-10 01:53:46 +000086 struct sched_param param;
Brian Silvermanf3cfbd72013-10-28 16:26:09 -070087 param.sched_priority = 30 + relative_priority;
brians343bc112013-02-10 01:53:46 +000088 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
Brian Silverman01be0002014-05-10 15:44:38 -070089 PDie("%s-init: setting SCHED_FIFO failed", program_invocation_short_name);
brians343bc112013-02-10 01:53:46 +000090 }
91 } else {
Austin Schuh9fe68f72019-08-10 19:32:03 -070092 fprintf(stderr,
93 "%s not doing realtime initialization because environment"
94 " variable %s is set\n",
95 program_invocation_short_name, kNoRealtimeEnvironmentVariable);
brians343bc112013-02-10 01:53:46 +000096 printf("no realtime for %s. see stderr\n", program_invocation_short_name);
97 }
98
Austin Schuhf257f3c2019-10-27 21:00:43 -070099 AOS_LOG(INFO, "%s initialized realtime\n", program_invocation_short_name);
brians343bc112013-02-10 01:53:46 +0000100}
101
102void Cleanup() {
Brian Silverman01be0002014-05-10 15:44:38 -0700103 aos_core_free_shared_mem();
brians343bc112013-02-10 01:53:46 +0000104}
105
Brian Silvermane4d8b282015-12-24 13:44:48 -0800106void PinCurrentThreadToCPU(int number) {
107 cpu_set_t cpuset;
108 CPU_ZERO(&cpuset);
109 CPU_SET(number, &cpuset);
Austin Schuhf257f3c2019-10-27 21:00:43 -0700110 AOS_PRCHECK(pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset));
Brian Silvermane4d8b282015-12-24 13:44:48 -0800111}
112
brians343bc112013-02-10 01:53:46 +0000113} // namespace aos