blob: 775cdbc72d0f749a1dc0e5664679f6dff2c636f5 [file] [log] [blame]
Tyler Chatowa79419d2020-08-12 20:12:11 -07001#ifndef AOS_STARTER_STARTERD_LIB_H_
2#define AOS_STARTER_STARTERD_LIB_H_
3
Tyler Chatowa79419d2020-08-12 20:12:11 -07004#include <sys/signalfd.h>
5#include <sys/wait.h>
6
Tyler Chatowbf0609c2021-07-31 16:13:27 -07007#include <csignal>
8#include <cstdio>
Tyler Chatowa79419d2020-08-12 20:12:11 -07009#include <string>
10#include <unordered_map>
11#include <vector>
12
13#include "aos/configuration.h"
Austin Schuh4d275fc2022-09-16 15:42:45 -070014#include "aos/ipc_lib/memory_mapped_queue.h"
Tyler Chatowa79419d2020-08-12 20:12:11 -070015#include "aos/ipc_lib/signalfd.h"
16#include "aos/macros.h"
17#include "aos/starter/starter_generated.h"
18#include "aos/starter/starter_rpc_generated.h"
James Kuszmaul3224b8e2022-01-07 19:00:39 -080019#include "aos/starter/subprocess.h"
James Kuszmaul6295a642022-03-22 15:23:59 -070020#include "aos/util/top.h"
Tyler Chatowa79419d2020-08-12 20:12:11 -070021
22namespace aos {
23namespace starter {
24
James Kuszmaul293b2172021-11-10 16:20:48 -080025const aos::Channel *StatusChannelForNode(const aos::Configuration *config,
26 const aos::Node *node);
27const aos::Channel *StarterRpcChannelForNode(const aos::Configuration *config,
28 const aos::Node *node);
29
Tyler Chatowa79419d2020-08-12 20:12:11 -070030class Starter {
31 public:
32 Starter(const aos::Configuration *event_loop_config);
33
34 // Inserts a new application from config. Returns the inserted application if
35 // it was successful, otherwise nullptr if an application already exists
36 // with the given name.
37 Application *AddApplication(const aos::Application *application);
38
39 // Runs the event loop and starts all applications
40 void Run();
41
42 void Cleanup();
43
James Kuszmaul6b35e3a2022-04-06 15:00:39 -070044 // EventLoop that we use for running the code. Mostly exposed for testing
45 // purposes.
46 EventLoop *event_loop() { return &event_loop_; }
47
Tyler Chatowa79419d2020-08-12 20:12:11 -070048 private:
49 // Signals which indicate starter has died
50 static const inline std::vector<int> kStarterDeath = {
51 SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, SIGFPE,
52 SIGSEGV, SIGPIPE, SIGTERM, SIGBUS, SIGXCPU};
53
54 void OnSignal(signalfd_siginfo signal);
James Kuszmaul293b2172021-11-10 16:20:48 -080055 void HandleStarterRpc(const StarterRpc &command);
Tyler Chatowa79419d2020-08-12 20:12:11 -070056
James Kuszmaul6295a642022-03-22 15:23:59 -070057 // Handles any potential state change in the child applications.
58 // In particular, sends the Status message if it wouldn't exceed the rate
59 // limit.
60 void HandleStateChange();
Austin Schuhfc304942021-10-16 14:20:05 -070061
Tyler Chatowa79419d2020-08-12 20:12:11 -070062 void SendStatus();
63
Austin Schuh4d275fc2022-09-16 15:42:45 -070064 // Creates a MemoryMappedQueue for the given channel, to pre-allocate shared
65 // memory to give this process credit for the memory instead of any other
66 // process that accesses it.
67 void AddChannel(const aos::Channel *channel);
68
Tyler Chatowa79419d2020-08-12 20:12:11 -070069 const std::string config_path_;
70 const aos::Configuration *config_msg_;
71
72 aos::ShmEventLoop event_loop_;
73 aos::Sender<aos::starter::Status> status_sender_;
74 aos::TimerHandler *status_timer_;
75 aos::TimerHandler *cleanup_timer_;
76
Austin Schuhfc304942021-10-16 14:20:05 -070077 int status_count_ = 0;
78 const int max_status_count_;
79
Tyler Chatowa79419d2020-08-12 20:12:11 -070080 std::unordered_map<std::string, Application> applications_;
Austin Schuh816a1162023-05-31 16:29:47 -070081
82 // Lock and list of all the queues. This makes it so we can initialize the
83 // queues in parallel, and also so starterd owns the memory for all the
84 // queues from cgroup's point of view.
85 std::mutex queue_mutex_;
Austin Schuh4d275fc2022-09-16 15:42:45 -070086 std::vector<std::unique_ptr<aos::ipc_lib::MemoryMappedQueue>> shm_queues_;
87
88 // Capture the --shm_base flag at construction time. This makes it much
89 // easier to make different shared memory regions for doing things like
90 // multi-node tests.
91 std::string shm_base_;
Tyler Chatowa79419d2020-08-12 20:12:11 -070092
93 // Set to true on cleanup to block rpc commands and ensure cleanup only
94 // happens once.
95 bool exiting_ = false;
96
97 SignalListener listener_;
98
James Kuszmaul6295a642022-03-22 15:23:59 -070099 util::Top top_;
100
Tyler Chatowa79419d2020-08-12 20:12:11 -0700101 DISALLOW_COPY_AND_ASSIGN(Starter);
102};
103
104} // namespace starter
105} // namespace aos
106
107#endif // AOS_STARTER_STARTERD_LIB_H_