From 85ed2b454732fc16aec19c7ef46cc8f37e25deeb Mon Sep 17 00:00:00 2001 From: Robert Vollmer Date: Tue, 16 Jun 2026 20:40:07 +0000 Subject: [PATCH] Shutdown callback for service interfaces --- .../xbot-service-interface/XbotServiceInterface.hpp | 10 ++++++++++ .../src/XbotServiceInterface.cpp | 12 +++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/libxbot-service-interface/include/xbot-service-interface/XbotServiceInterface.hpp b/libxbot-service-interface/include/xbot-service-interface/XbotServiceInterface.hpp index f681121..26c83b8 100644 --- a/libxbot-service-interface/include/xbot-service-interface/XbotServiceInterface.hpp +++ b/libxbot-service-interface/include/xbot-service-interface/XbotServiceInterface.hpp @@ -5,6 +5,8 @@ #ifndef XBOT_FRAMEWORK_XBOTSERVICEINTERFACE_HPP #define XBOT_FRAMEWORK_XBOTSERVICEINTERFACE_HPP +#include + #include #include @@ -15,6 +17,14 @@ struct Context { void *ctx = nullptr; }; +using ShutdownCallback = std::function; + +/** + * Register a callback invoked after Stop() when SIGINT/SIGTERM is received. + * Must be called before Start() if register_signal_handlers is true. + */ +void SetShutdownCallback(ShutdownCallback callback); + /** * Call this method to start xbot_framework. * diff --git a/libxbot-service-interface/src/XbotServiceInterface.cpp b/libxbot-service-interface/src/XbotServiceInterface.cpp index 64ff6de..0924622 100644 --- a/libxbot-service-interface/src/XbotServiceInterface.cpp +++ b/libxbot-service-interface/src/XbotServiceInterface.cpp @@ -26,10 +26,18 @@ hub::CrowToSpeedlogHandler logger{}; std::unique_ptr pjb = nullptr; std::unique_ptr crow_app = nullptr; +ShutdownCallback shutdown_callback{}; + void SignalHandler(int signal) { Stop(); + if (shutdown_callback) { + shutdown_callback(); + } +} + +void xbot::serviceif::SetShutdownCallback(ShutdownCallback callback) { + shutdown_callback = std::move(callback); } -struct sigaction act; xbot::serviceif::Context xbot::serviceif::Start(bool register_handlers, std::string bind_ip, bool start_rest_api) { std::unique_lock lk{mtx}; @@ -104,7 +112,9 @@ xbot::serviceif::Context xbot::serviceif::Start(bool register_handlers, std::str if (register_handlers) { // Register own signal handlers + struct sigaction act {}; act.sa_handler = SignalHandler; + sigemptyset(&act.sa_mask); sigaction(SIGINT, &act, nullptr); sigaction(SIGTERM, &act, nullptr); }