45 EV_SET(&change, parent_pid, EVFILT_PROC, EV_ADD | EV_ENABLE, NOTE_EXIT, 0,
nullptr);
64int execute_avm_server(
const std::string& input_path,
const std::string& wsdb_path,
const std::string& cdb_path)
67 std::cerr <<
"Connecting to aztec-wsdb at " << wsdb_path <<
'\n';
68 constexpr int max_retries = 50;
69 constexpr int retry_delay_ms = 100;
71 for (
int attempt = 0; attempt < max_retries; ++attempt) {
75 }
catch (
const std::exception& e) {
76 if (attempt == max_retries - 1) {
77 std::cerr <<
"Failed to connect to aztec-wsdb after " << max_retries <<
" attempts: " << e.what()
81 std::this_thread::sleep_for(std::chrono::milliseconds(retry_delay_ms));
86 std::cerr <<
"Connecting to aztec-cdb at " << cdb_path <<
'\n';
88 for (
int attempt = 0; attempt < max_retries; ++attempt) {
92 }
catch (
const std::exception& e) {
93 if (attempt == max_retries - 1) {
94 std::cerr <<
"Failed to connect to aztec-cdb after " << max_retries <<
" attempts: " << e.what()
98 std::this_thread::sleep_for(std::chrono::milliseconds(retry_delay_ms));
107 if (input_path.size() >= 5 && input_path.substr(input_path.size() - 5) ==
".sock") {
109 std::cerr <<
"Socket server at " << input_path <<
'\n';
111 std::cerr <<
"Error: --input path must end with .sock" <<
'\n';
118 auto graceful_shutdown_handler = [](
int signal) {
119 std::cerr <<
"\nReceived signal " << signal <<
", shutting down gracefully..." <<
'\n';
125 auto fatal_error_handler = [](
int signal) {
126 const char* signal_name = (signal == SIGBUS) ?
"SIGBUS" : (signal == SIGSEGV) ?
"SIGSEGV" :
"UNKNOWN";
127 std::cerr <<
"\nFatal error: received " << signal_name <<
'\n';
129 global_server->
close();
136 auto cancel_simulation_handler = [](
int ) {
143 (void)
std::signal(SIGTERM, graceful_shutdown_handler);
144 (void)
std::signal(SIGINT, graceful_shutdown_handler);
145 (void)
std::signal(SIGUSR1, cancel_simulation_handler);
149 setup_parent_death_monitoring();
151 if (!server->listen()) {
152 std::cerr <<
"Error: Could not start IPC server" <<
'\n';
156 std::cerr <<
"aztec-avm IPC server ready" <<
'\n';
162 auto unpacked = msgpack::unpack(
reinterpret_cast<const char*
>(raw_request.data()), raw_request.size());
163 auto obj = unpacked.get();
167 if (obj.type != msgpack::type::ARRAY || obj.via.array.size != 1) {
168 std::cerr <<
"Error: Expected array of size 1 from client " << client_id <<
'\n';
173 auto& command_obj = obj.via.array.ptr[0];
177 if (command_obj.type == msgpack::type::ARRAY && command_obj.via.array.size == 2 &&
178 command_obj.via.array.ptr[0].type == msgpack::type::STR) {
180 std::string_view command_name(command_obj.via.array.ptr[0].via.str.ptr,
181 command_obj.via.array.ptr[0].via.str.size);
182 bool is_shutdown = (command_name ==
"AvmShutdown");
186 command_obj.convert(command);
190 msgpack::sbuffer response_buffer;
191 msgpack::pack(response_buffer, response);
192 std::vector<uint8_t> result(response_buffer.data(), response_buffer.data() + response_buffer.size());
203 command_obj.convert(command);
206 msgpack::sbuffer response_buffer;
207 msgpack::pack(response_buffer, response);
208 return std::vector<uint8_t>(response_buffer.data(), response_buffer.data() + response_buffer.size());
212 }
catch (
const std::exception& e) {
213 std::cerr <<
"Error processing request from client " << client_id <<
": " << e.what() <<
'\n';
219 msgpack::sbuffer response_buffer;
220 msgpack::pack(response_buffer, response);
221 return std::vector<uint8_t>(response_buffer.data(), response_buffer.data() + response_buffer.size());