Mads
Multi-Agent Distributed System
Loading...
Searching...
No Matches
process_manager.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "director_config.hpp"
4
5#include <cstdint>
6#include <deque>
7#include <optional>
8#include <string>
9#include <vector>
10
11class PlatformProcess;
12
14 std::string name;
15 std::string base_name;
16 std::string command;
17 bool running = false;
18 bool ever_started = false;
19 int pid = -1;
20 int exit_code = 0;
21 bool enabled = true;
22 bool relaunch = false;
23 bool tty = false;
24 std::vector<std::string> dependencies;
25 std::deque<std::string> logs;
26 std::string live_line;
28 std::uint32_t thread_count = 0;
29 std::uint64_t ram_bytes = 0;
30 std::uint32_t cpu_count = 1;
31 std::vector<float> cpu_percent_per_core_history;
32};
33
35 public:
42
43 bool initialize(const Mads::DirectorConfig& config, std::string* out_error);
44 bool reload(const Mads::DirectorConfig& config, std::string* out_error);
45
47 void tick();
48 void stop_all();
49
50 std::size_t process_count() const;
51 const ProcessRuntimeView* process_at(std::size_t index) const;
52
53 bool start_process(std::size_t index, std::string* out_error);
54 bool stop_process(std::size_t index, std::string* out_error);
55 bool restart_process(std::size_t index, std::string* out_error);
56 bool send_siginfo(std::size_t index, std::string* out_error);
57 bool send_input(std::size_t index, const std::string& input, std::string* out_error);
58 bool attach_process(std::size_t index, std::string* out_error);
59 bool open_external_attach(std::size_t index, const std::string& executable_path, std::string* out_error);
60
61 private:
62 struct ManagedProcess;
63 struct ExternalAttachSession {
64 std::size_t process_index = 0;
65#ifdef _WIN32
66 std::uintptr_t listen_handle = 0;
67 std::uintptr_t client_handle = 0;
68#else
69 int listen_fd = -1;
70 int client_fd = -1;
71#endif
72 std::string socket_path;
73 bool active = false;
74 };
75
76 bool can_start(const ManagedProcess& process) const;
77 bool start_process_internal(std::size_t index, std::string* out_error);
78 void sample_metrics_if_due();
79 void sample_process_metrics(ManagedProcess* process);
80 void capture_output(ManagedProcess* process);
81 void append_log(ManagedProcess* process, const std::string& text);
82 void append_log_line(ManagedProcess* process, const std::string& text);
83 void poll_external_attach();
84 void close_external_attach(const std::string& reason);
85 void enforce_log_limit(ManagedProcess* process);
86
87 std::vector<ManagedProcess> _processes;
88 ExternalAttachSession _external_attach;
89 std::optional<std::string> _terminal_command;
90 double _sample_rate_seconds = 2.0;
91 std::uint64_t _last_sample_tick_ms = 0;
92};
bool open_external_attach(std::size_t index, const std::string &executable_path, std::string *out_error)
bool send_siginfo(std::size_t index, std::string *out_error)
bool start_process(std::size_t index, std::string *out_error)
ProcessManager(const ProcessManager &)=delete
bool stop_process(std::size_t index, std::string *out_error)
bool restart_process(std::size_t index, std::string *out_error)
bool send_input(std::size_t index, const std::string &input, std::string *out_error)
const ProcessRuntimeView * process_at(std::size_t index) const
bool attach_process(std::size_t index, std::string *out_error)
ProcessManager(ProcessManager &&)=delete
bool reload(const Mads::DirectorConfig &config, std::string *out_error)
std::size_t process_count() const
ProcessManager & operator=(const ProcessManager &)=delete
void launch_ready_processes()
bool initialize(const Mads::DirectorConfig &config, std::string *out_error)
ProcessManager & operator=(ProcessManager &&)=delete
A fully parsed, validated, expanded director.toml. processes is already in a valid topological start ...
std::vector< float > cpu_percent_per_core_history
std::uint64_t ram_bytes
std::vector< std::string > dependencies
std::uint32_t thread_count
std::deque< std::string > logs
std::uint32_t cpu_count