From 72540dbf67d397d7968224ca28158435471699f7 Mon Sep 17 00:00:00 2001 From: Cameron Craig Date: Thu, 23 Jul 2026 12:09:26 +0000 Subject: [PATCH 01/14] feat: Add createWatchdog factory method --- score/launch_manager/src/daemon/src/main.cpp | 11 +++++++++-- .../src/daemon/src/watchdog/IWatchdogIf.hpp | 5 +++++ .../src/daemon/src/watchdog/details/WatchdogImpl.cpp | 6 ++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/score/launch_manager/src/daemon/src/main.cpp b/score/launch_manager/src/daemon/src/main.cpp index 90b664d8d..bec97b476 100644 --- a/score/launch_manager/src/daemon/src/main.cpp +++ b/score/launch_manager/src/daemon/src/main.cpp @@ -201,8 +201,15 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] const char* argv[]) std::unique_ptr aliveMonitorThread{ std::make_unique(std::move(healthMonitor))}; - std::unique_ptr process_group_manager = std::make_unique( - std::move(aliveMonitorThread), recoveryClient, std::move(process_state_notifier)); +#ifdef USE_NEW_CONFIGURATION + auto watchdog = score::lcm::watchdog::createWatchdog(); + auto process_group_manager = std::make_unique( + std::move(aliveMonitorThread), recoveryClient, std::move(process_state_notifier), std::move(watchdog)); +#else + // Legacy configuration wires no watchdog; the watchdog usage in PGM is #ifdef-guarded off. + auto process_group_manager = std::make_unique( + std::move(aliveMonitorThread), recoveryClient, std::move(process_state_notifier), nullptr); +#endif #ifdef USE_NEW_CONFIGURATION if (process_group_manager->initialize(*config_result)) diff --git a/score/launch_manager/src/daemon/src/watchdog/IWatchdogIf.hpp b/score/launch_manager/src/daemon/src/watchdog/IWatchdogIf.hpp index ebe092cb8..58fef1f18 100644 --- a/score/launch_manager/src/daemon/src/watchdog/IWatchdogIf.hpp +++ b/score/launch_manager/src/daemon/src/watchdog/IWatchdogIf.hpp @@ -16,6 +16,7 @@ #define IWATCHDOGIF_HPP_INCLUDED #include +#include #include "score/mw/launch_manager/watchdog/IDeviceConfigFactory.hpp" @@ -123,6 +124,10 @@ class IWatchdogIf }; }; +/// @brief Creates a concrete WatchdogImpl instance behind the IWatchdogIf interface. +/// @return An owning pointer to a new watchdog implementation. +std::unique_ptr createWatchdog(); + } // namespace watchdog } // namespace lcm } // namespace score diff --git a/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp b/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp index 69e3c1dc6..356419e6c 100644 --- a/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp +++ b/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp @@ -481,6 +481,12 @@ void WatchdogImpl::waitForever() const noexcept /* RULECHECKER_comment(1:0,1:0, check_pragma_usage, "External tooling requires pragma", true_no_defect) */ #pragma CTC ENDSKIP #endif + +std::unique_ptr createWatchdog() +{ + return std::make_unique(); +} + } // namespace watchdog } // namespace lcm } // namespace score From 3c4fb6345aeed80af5b077f3964e09fc19ccabb5 Mon Sep 17 00:00:00 2001 From: Cameron Craig Date: Thu, 23 Jul 2026 12:13:30 +0000 Subject: [PATCH 02/14] feat: Add watchdog ownership to ProcessGroupManager --- .../src/daemon/src/process_group_manager/BUILD | 2 ++ .../details/process_group_manager.cpp | 10 ++++------ .../process_group_manager/process_group_manager.hpp | 12 +++++++++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/score/launch_manager/src/daemon/src/process_group_manager/BUILD b/score/launch_manager/src/daemon/src/process_group_manager/BUILD index 8fd583c3c..e94bd0b85 100644 --- a/score/launch_manager/src/daemon/src/process_group_manager/BUILD +++ b/score/launch_manager/src/daemon/src/process_group_manager/BUILD @@ -71,6 +71,8 @@ cc_library( "//score/launch_manager/src/daemon/src/process_group_manager/details:safe_process_map", "//score/launch_manager/src/daemon/src/process_state_client:iprocess_state_notifier", "//score/launch_manager/src/daemon/src/recovery_client", + "//score/launch_manager/src/daemon/src/watchdog:i_device_config_factory", + "//score/launch_manager/src/daemon/src/watchdog:i_watchdog_if", "@score_baselibs//score/language/futurecpp", ] + select({ "//config:lm_use_new_configuration": [ diff --git a/score/launch_manager/src/daemon/src/process_group_manager/details/process_group_manager.cpp b/score/launch_manager/src/daemon/src/process_group_manager/details/process_group_manager.cpp index 40c94ba54..3b2fc2a91 100644 --- a/score/launch_manager/src/daemon/src/process_group_manager/details/process_group_manager.cpp +++ b/score/launch_manager/src/daemon/src/process_group_manager/details/process_group_manager.cpp @@ -39,7 +39,8 @@ void ProcessGroupManager::cancel() ProcessGroupManager::ProcessGroupManager(std::unique_ptr alive_monitor_thread, std::shared_ptr recovery_client, - std::unique_ptr process_state_notifier) + std::unique_ptr process_state_notifier, + std::unique_ptr watchdog) : configuration_(), process_interface_(), process_map_(nullptr), @@ -50,10 +51,8 @@ ProcessGroupManager::ProcessGroupManager(std::unique_ptr al process_groups_(), process_state_notifier_(std::move(process_state_notifier)), alive_monitor_thread_(std::move(alive_monitor_thread)), - recovery_client_(recovery_client) //, - // ucm_polling_thread_( -// [this](const Message::Action act, const Message::UpdateContext updateCtx, const lib::fun::string& swc) -> bool -// { return reloadConfiguration(act, updateCtx, IdentifierHash(swc.c_str())); }) + recovery_client_(recovery_client), + watchdog_(std::move(watchdog)) { } @@ -166,7 +165,6 @@ inline bool ProcessGroupManager::initializeControlClientHandler() return false; } - if (osal::IpcCommsSync::control_client_handler_nudge_fd == fd2) { void* buf = mmap(NULL, sizeof(osal::Semaphore), PROT_WRITE, MAP_SHARED, fd2, 0); diff --git a/score/launch_manager/src/daemon/src/process_group_manager/process_group_manager.hpp b/score/launch_manager/src/daemon/src/process_group_manager/process_group_manager.hpp index 9b2c57c68..38c7a1f9b 100644 --- a/score/launch_manager/src/daemon/src/process_group_manager/process_group_manager.hpp +++ b/score/launch_manager/src/daemon/src/process_group_manager/process_group_manager.hpp @@ -36,7 +36,8 @@ #include "score/mw/launch_manager/common/concurrency/workerthread.hpp" #include "score/mw/launch_manager/process_group_manager/ialive_monitor_thread.hpp" #include "score/mw/launch_manager/recovery_client/recovery_client.hpp" -#include "score/mw/launch_manager/common/constants.hpp" +#include "score/mw/launch_manager/watchdog/IDeviceConfigFactory.hpp" +#include "score/mw/launch_manager/watchdog/IWatchdogIf.hpp" namespace score::lcm::internal { @@ -76,9 +77,12 @@ class ProcessGroupManager final /// @param recovery_client A shared pointer to an IRecoveryClient instance for handling recovery operations. /// @param process_state_notifier A unique pointer to an IProcessStateNotifier instance for notifying the Alive /// Monitor thread of process state changes. + /// @param watchdog A unique pointer to an IWatchdogIf instance serviced during the main loop. May be nullptr in + /// legacy configuration where no watchdog is wired. ProcessGroupManager(std::unique_ptr alive_monitor_thread, std::shared_ptr recovery_client, - std::unique_ptr process_state_notifier); + std::unique_ptr process_state_notifier, + std::unique_ptr watchdog); /// @brief Initializes the process group manager. /// Loads the flat configuration through ConfigurationManager. @@ -282,7 +286,6 @@ class ProcessGroupManager final inline bool initializeProcessGroups(); #endif - /// @brief Creates process component objects, including the job queue and worker threads. inline void createProcessComponentsObjects(); @@ -336,6 +339,9 @@ class ProcessGroupManager final std::unique_ptr alive_monitor_thread_; std::shared_ptr recovery_client_{}; + + /// @brief The watchdog serviced during the main loop. May be nullptr in legacy configuration. + std::unique_ptr watchdog_; }; } // namespace score::lcm::internal From 9b628dbe7edd719f410c87aa3a938dd23c50f0c6 Mon Sep 17 00:00:00 2001 From: Cameron Craig Date: Thu, 23 Jul 2026 12:16:12 +0000 Subject: [PATCH 03/14] feat: Remove watchdog from alive monitor / PhmDaemon --- .../details/daemon/AliveMonitorImpl.cpp | 8 +----- .../details/daemon/AliveMonitorImpl.hpp | 10 +------ .../src/alive_monitor/details/daemon/BUILD | 2 -- .../details/daemon/PhmDaemon.cpp | 27 +++---------------- .../details/daemon/PhmDaemon.hpp | 22 --------------- .../src/alive_monitor/details/factory/BUILD | 2 +- score/launch_manager/src/daemon/src/main.cpp | 4 +-- 7 files changed, 7 insertions(+), 68 deletions(-) diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/AliveMonitorImpl.cpp b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/AliveMonitorImpl.cpp index 455e219a9..fb706a051 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/AliveMonitorImpl.cpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/AliveMonitorImpl.cpp @@ -18,7 +18,6 @@ #include #include "score/mw/launch_manager/alive_monitor/details/daemon/AliveMonitorImpl.hpp" -#include "score/mw/launch_manager/watchdog/details/WatchdogImpl.hpp" namespace score { @@ -31,21 +30,17 @@ namespace daemon #ifdef USE_NEW_CONFIGURATION AliveMonitorImpl::AliveMonitorImpl(SptrIRecoveryClient recovery_client, - UptrIWatchdogIf watchdog, UptrIProcessStateReceiver process_state_receiver, const Config& config) : m_recovery_client(recovery_client), - m_watchdog(std::move(watchdog)), m_process_state_receiver{std::move(process_state_receiver)}, m_config(config) { } #else AliveMonitorImpl::AliveMonitorImpl(SptrIRecoveryClient recovery_client, - UptrIWatchdogIf watchdog, UptrIProcessStateReceiver process_state_receiver) : m_recovery_client(recovery_client), - m_watchdog(std::move(watchdog)), m_process_state_receiver{std::move(process_state_receiver)} { } @@ -58,8 +53,7 @@ EInitCode AliveMonitorImpl::init() noexcept { m_osClock.startMeasurement(); - m_daemon = std::make_unique(m_osClock, std::move(m_watchdog), - std::move(m_process_state_receiver)); + m_daemon = std::make_unique(m_osClock, std::move(m_process_state_receiver)); #ifdef USE_NEW_CONFIGURATION initResult = m_daemon->init(m_recovery_client, m_config); #else diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/AliveMonitorImpl.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/AliveMonitorImpl.hpp index d3dd55fd4..f694198e7 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/AliveMonitorImpl.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/AliveMonitorImpl.hpp @@ -26,16 +26,11 @@ namespace lcm { class IRecoveryClient; -namespace watchdog { -class IWatchdogIf; -} - namespace saf { namespace daemon { using SptrIRecoveryClient = std::shared_ptr; -using UptrIWatchdogIf = std::unique_ptr; using UptrIProcessStateReceiver = std::unique_ptr; using UptrPhmDaemon = std::unique_ptr; using OsClock = score::lcm::saf::timers::OsClockInterface; @@ -47,12 +42,10 @@ class AliveMonitorImpl : public IAliveMonitor { public: #ifdef USE_NEW_CONFIGURATION AliveMonitorImpl(SptrIRecoveryClient recovery_client, - UptrIWatchdogIf watchdog, UptrIProcessStateReceiver process_state_receiver, const Config& config); #else - AliveMonitorImpl(SptrIRecoveryClient recovery_client, - UptrIWatchdogIf watchdog, + AliveMonitorImpl(SptrIRecoveryClient recovery_client, UptrIProcessStateReceiver process_state_receiver); #endif @@ -62,7 +55,6 @@ class AliveMonitorImpl : public IAliveMonitor { private: SptrIRecoveryClient m_recovery_client{nullptr}; - UptrIWatchdogIf m_watchdog{nullptr}; UptrPhmDaemon m_daemon{nullptr}; OsClock m_osClock{}; UptrIProcessStateReceiver m_process_state_receiver; diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD index d86aec34c..4e28edbda 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD @@ -74,7 +74,6 @@ cc_library( "//score/launch_manager/src/daemon/src/alive_monitor/details/timers:cycle_timer", "//score/launch_manager/src/daemon/src/alive_monitor/details/timers:timers_os_clock", "//score/launch_manager/src/daemon/src/common:log", - "//score/launch_manager/src/daemon/src/watchdog:i_watchdog_if", "//score/launch_manager/src/lifecycle_client", ] + select({ "//config:lm_use_new_configuration": [ @@ -106,7 +105,6 @@ cc_library( visibility = ["//score/launch_manager/src/daemon:__subpackages__"], deps = [ ":i_health_monitor", - "//score/launch_manager/src/daemon/src/watchdog/details:watchdog_impl", "@score_baselibs//score/language/futurecpp", ], ) diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.cpp b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.cpp index 5c213dede..8827a2669 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.cpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.cpp @@ -31,22 +31,17 @@ namespace daemon true_no_defect) */ /* RULECHECKER_comment(0, 4, check_incomplete_data_member_construction, "Default constructor is used for\ processStateReader.", true_no_defect) */ -PhmDaemon::PhmDaemon(OsClock& f_osClock, - std::unique_ptr f_watchdog, - std::unique_ptr f_process_state_receiver) +PhmDaemon::PhmDaemon(OsClock& f_osClock, std::unique_ptr f_process_state_receiver) : osClock{f_osClock}, cycleTimer{&osClock}, swClusterHandlers{}, - processStateReader{std::move(f_process_state_receiver)}, - watchdog(std::move(f_watchdog)) + processStateReader{std::move(f_process_state_receiver)} { static_cast(f_osClock); } void PhmDaemon::performCyclicTriggers(void) { - bool isCriticalFailure{false}; - NanoSecondType syncTimestamp{timers::OsClock::getMonotonicSystemClock()}; if (syncTimestamp == 0U) { @@ -55,29 +50,13 @@ void PhmDaemon::performCyclicTriggers(void) syncTimestamp = UINT64_MAX; } - isCriticalFailure = (!processStateReader.distributeChanges(syncTimestamp)); - - if (!isCriticalFailure) + if (processStateReader.distributeChanges(syncTimestamp)) { for (auto& phmHandler : swClusterHandlers) { phmHandler.performCyclicTriggers(syncTimestamp); - isCriticalFailure = isCriticalFailure || phmHandler.hasAnyRecoveryEnqueueFailed(); } } - - // watchdog is fired iff: - // * isCriticalFailure is set (e.g. process state distribution error, recovery ring buffer full) - // else: - // * watchdog is serviced - if (!isCriticalFailure) - { - watchdog->serviceWatchdog(); - } - else - { - watchdog->fireWatchdogReaction(); - } } #ifdef USE_NEW_CONFIGURATION diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp index dac9eb966..3d8ec97b0 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp @@ -25,7 +25,6 @@ #include "score/mw/launch_manager/alive_monitor/details/ifexm/ProcessStateReader.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/CycleTimeValidator.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/CycleTimer.hpp" -#include "score/mw/launch_manager/watchdog/IWatchdogIf.hpp" #ifdef USE_NEW_CONFIGURATION #include "score/mw/launch_manager/configuration/config.hpp" #endif @@ -45,8 +44,6 @@ enum class EInitCode : std::int8_t kNotInitialized, ///< Init was not performed kCycleTimeInitFailed, ///< Cyclic Timer initialization failed kConstructFlatCfgFactoryFailed, ///< FlatCfgFactory failed loading SWCL configurations - kWatchdogInitFailed, ///< Watchdog Initialization failed - kWatchdogEnableFailed, ///< Enabling watchdog device failed kMachineConfigInitFailed, ///< MachineConfigFactory failed loading the machine configuration kSignalHandlerRegistrationFailed, ///< Failed to register signal handler for termination signals kGeneralError ///< General error @@ -60,7 +57,6 @@ class PhmDaemon { public: using OsClock = score::lcm::saf::timers::OsClockInterface; - using Watchdog = watchdog::IWatchdogIf; using ProcessStateReceiver = score::lcm::IProcessStateReceiver; using RecoveryClient = score::lcm::IRecoveryClient; using MachineConfigFactory = factory::MachineConfigFactory; @@ -77,12 +73,10 @@ class PhmDaemon as same as generated function", true_no_defect) */ /// @brief Set the OS clock interface /// @param[in] f_osClock Access to the system clock (dependency injection possible in tests) - /// @param[in] f_watchdog watchdog implementation (dependency injection possible in tests) /// @param[in] f_process_state_receiver process state receiver implementation (dependency injection possible in tests) /* RULECHECKER_comment(3,1, check_expensive_to_copy_in_parameter, "Move only types cannot be passed by const ref", true_no_defect) */ PhmDaemon(OsClock& f_osClock, - std::unique_ptr f_watchdog, std::unique_ptr f_process_state_receiver); /* RULECHECKER_comment(0, 4, check_min_instructions, "Default destructor is not provided\ @@ -150,18 +144,6 @@ class PhmDaemon return EInitCode::kCycleTimeInitFailed; } - if (!watchdog->init(cycleTimeModified, machineConfig)) - { - LM_LOG_ERROR() << "Phm Daemon: Initialization of watchdog failed!"; - return EInitCode::kWatchdogInitFailed; - } - - if (!watchdog->enable()) - { - LM_LOG_ERROR() << "Phm Daemon: Enabling of watchdog failed!"; - return EInitCode::kWatchdogEnableFailed; - } - return EInitCode::kNoError; } @@ -234,7 +216,6 @@ class PhmDaemon } LM_LOG_INFO() << "Phm Daemon: Received termination request - shutting down"; - watchdog->disable(); return true; } @@ -267,9 +248,6 @@ class PhmDaemon /// @brief Process State Reader for PHM daemon ProcessStateReader processStateReader; - - /// @brief Connection to watchdog devices - std::unique_ptr watchdog; }; } // namespace daemon diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD index df83b0384..a19ba40c0 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD @@ -49,7 +49,7 @@ cc_library( }), include_prefix = "score/mw/launch_manager/alive_monitor/details/factory", strip_include_prefix = "/score/launch_manager/src/daemon/src/alive_monitor/details/factory", - visibility = ["//score/launch_manager/src/daemon/src/alive_monitor:__subpackages__"], + visibility = ["//score/launch_manager/src/daemon:__subpackages__"], deps = [ ":static_config", "//score/launch_manager/src/daemon/src/alive_monitor/config", diff --git a/score/launch_manager/src/daemon/src/main.cpp b/score/launch_manager/src/daemon/src/main.cpp index bec97b476..2ff06bc2c 100644 --- a/score/launch_manager/src/daemon/src/main.cpp +++ b/score/launch_manager/src/daemon/src/main.cpp @@ -188,12 +188,10 @@ int main([[maybe_unused]] int argc, [[maybe_unused]] const char* argv[]) #endif LM_LOG_DEBUG() << "Launch Manager Started !!!!"; std::shared_ptr recoveryClient{std::make_shared()}; - std::unique_ptr watchdog{ - std::make_unique()}; auto process_state_notifier = std::make_unique(); std::unique_ptr healthMonitor{ std::make_unique( - recoveryClient, std::move(watchdog), process_state_notifier->constructReceiver() + recoveryClient, process_state_notifier->constructReceiver() #ifdef USE_NEW_CONFIGURATION , *config_result #endif From ab86a4cd48cd4c2ef4c2b305351290cbb80424b1 Mon Sep 17 00:00:00 2001 From: Cameron Craig Date: Thu, 23 Jul 2026 12:17:14 +0000 Subject: [PATCH 04/14] feat: Call watchdog methods from ProcessGroupManager --- .../details/process_group_manager.cpp | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/score/launch_manager/src/daemon/src/process_group_manager/details/process_group_manager.cpp b/score/launch_manager/src/daemon/src/process_group_manager/details/process_group_manager.cpp index 3b2fc2a91..79dccd544 100644 --- a/score/launch_manager/src/daemon/src/process_group_manager/details/process_group_manager.cpp +++ b/score/launch_manager/src/daemon/src/process_group_manager/details/process_group_manager.cpp @@ -117,12 +117,35 @@ bool ProcessGroupManager::initialize() return false; } +#ifdef USE_NEW_CONFIGURATION + const auto watchdog_config = config.watchdog(); + + // Watchdog config may not be available if no watchdog is configured + if (watchdog_config.has_value()) + { + if (!watchdog_->init(watchdog_config.value(), score::lcm::internal::kMainLoopCycleTimeNs)) + { + LM_LOG_ERROR() << "Watchdog initialization failed"; + return false; + } + if (!watchdog_->enable()) + { + LM_LOG_ERROR() << "Watchdog enable failed"; + return false; + } + } + +#endif + return true; } void ProcessGroupManager::deinitialize() { // ucm_polling_thread_.stopPolling(); +#ifdef USE_NEW_CONFIGURATION + watchdog_->disable(); +#endif alive_monitor_thread_->stop(); configuration_.deinitialize(); process_groups_.clear(); @@ -310,6 +333,16 @@ bool ProcessGroupManager::run() processGroupHandler(*pg); } recoveryActionHandler(); + +#ifdef USE_NEW_CONFIGURATION + if (recovery_client_ && recovery_client_->hasOverflow()) + { + LM_LOG_ERROR() << "Recovery client overflow detected, firing watchdog"; + watchdog_->fireWatchdogReaction(); + } + + watchdog_->serviceWatchdog(); +#endif } allProcessGroupsOff(); From 04e1838fabdcbe78be3fcada453103fb473f4836 Mon Sep 17 00:00:00 2001 From: Cameron Craig Date: Thu, 23 Jul 2026 12:19:50 +0000 Subject: [PATCH 05/14] feat: Update BUILD files to reflect the new watchdog ownership --- score/launch_manager/src/daemon/BUILD | 3 +++ score/launch_manager/src/daemon/src/watchdog/BUILD | 5 ++++- score/launch_manager/src/daemon/src/watchdog/details/BUILD | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/score/launch_manager/src/daemon/BUILD b/score/launch_manager/src/daemon/BUILD index 964a44acd..87c307816 100644 --- a/score/launch_manager/src/daemon/BUILD +++ b/score/launch_manager/src/daemon/BUILD @@ -33,10 +33,13 @@ cc_binary( "//score/launch_manager/src/daemon/src/process_group_manager:alive_monitor_thread", "//score/launch_manager/src/daemon/src/process_state_client:process_state_notifier", "//score/launch_manager/src/daemon/src/recovery_client", + "//score/launch_manager/src/daemon/src/watchdog:i_watchdog_if", "@score_baselibs//score/language/futurecpp", ] + select({ "//config:lm_use_new_configuration": [ + "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:machine_config_factory", "//score/launch_manager/src/daemon/src/configuration:flatbuffer_config_loader", + "//score/launch_manager/src/daemon/src/watchdog/details:watchdog_impl", ], "//conditions:default": [], }), diff --git a/score/launch_manager/src/daemon/src/watchdog/BUILD b/score/launch_manager/src/daemon/src/watchdog/BUILD index 0f1c87d62..3b54e7b1e 100644 --- a/score/launch_manager/src/daemon/src/watchdog/BUILD +++ b/score/launch_manager/src/daemon/src/watchdog/BUILD @@ -26,5 +26,8 @@ cc_library( include_prefix = "score/mw/launch_manager/watchdog", strip_include_prefix = "/score/launch_manager/src/daemon/src/watchdog", visibility = ["//score:__subpackages__"], - deps = [":i_device_config_factory"], + deps = [ + ":i_device_config_factory", + "//score/launch_manager/src/daemon/src/common:constants", + ], ) diff --git a/score/launch_manager/src/daemon/src/watchdog/details/BUILD b/score/launch_manager/src/daemon/src/watchdog/details/BUILD index b8b8c3c4e..7f5dc12fa 100644 --- a/score/launch_manager/src/daemon/src/watchdog/details/BUILD +++ b/score/launch_manager/src/daemon/src/watchdog/details/BUILD @@ -42,6 +42,7 @@ cc_library( ":watchdog", "//score/launch_manager/src/daemon/src/alive_monitor/details/timers:os_clock_interface", "//score/launch_manager/src/daemon/src/common:log", + "//score/launch_manager/src/daemon/src/configuration:config", "//score/launch_manager/src/daemon/src/watchdog:i_device_config_factory", "//score/launch_manager/src/daemon/src/watchdog:i_watchdog_if", "@score_baselibs//score/language/futurecpp", From 37bcdd7654c5fcd32c9669a561c53596a366ae6f Mon Sep 17 00:00:00 2001 From: Cameron Craig Date: Thu, 23 Jul 2026 12:23:53 +0000 Subject: [PATCH 06/14] feat: Reduce wait time in run loop --- .../src/daemon/src/common/constants.hpp | 3 ++ .../src/daemon/src/configuration/config.hpp | 4 +-- .../details/process_group_manager.cpp | 6 ++-- .../src/daemon/src/watchdog/IWatchdogIf.hpp | 20 ++++++++--- .../src/watchdog/details/WatchdogImpl.cpp | 36 ++++++++++--------- .../src/watchdog/details/WatchdogImpl.hpp | 3 +- 6 files changed, 46 insertions(+), 26 deletions(-) diff --git a/score/launch_manager/src/daemon/src/common/constants.hpp b/score/launch_manager/src/daemon/src/common/constants.hpp index 22843d1c7..c0100d4c6 100644 --- a/score/launch_manager/src/daemon/src/common/constants.hpp +++ b/score/launch_manager/src/daemon/src/common/constants.hpp @@ -47,6 +47,9 @@ constexpr std::chrono::milliseconds kMaxRunningDelay{1000}; ///< report_running constexpr std::chrono::milliseconds kControlClientMaxIpcDelay{500}; ///< The maximum time to wait, when trying to communicate with LCM. When this time is exceeded kCommunicationError will be returned constexpr std::chrono::milliseconds kControlClientBgThreadSleepTime{100}; +constexpr std::int64_t kMainLoopCycleTimeMs{50}; ///< The period at which the main loop services the watchdog +constexpr std::int64_t kMainLoopCycleTimeNs{kMainLoopCycleTimeMs * 1'000'000LL}; + enum class ControlClientLimits : uint16_t { kControlClientMaxInstances = 256U, ///< Maximum number of ControlClient instances that should be created by state manager. If state manager create more instances than kMaxInstances, those instances will always return kCommunicationError when used diff --git a/score/launch_manager/src/daemon/src/configuration/config.hpp b/score/launch_manager/src/daemon/src/configuration/config.hpp index 49810d483..bc96ed7a3 100644 --- a/score/launch_manager/src/daemon/src/configuration/config.hpp +++ b/score/launch_manager/src/daemon/src/configuration/config.hpp @@ -13,11 +13,11 @@ #ifndef CONFIG_HPP #define CONFIG_HPP +#include #include #include #include #include -#include #include namespace score::mw::launch_manager::configuration @@ -291,4 +291,4 @@ class ConfigBuilder } // namespace score::mw::launch_manager::configuration -#endif // CONFIG_HPP +#endif // CONFIG_HPP diff --git a/score/launch_manager/src/daemon/src/process_group_manager/details/process_group_manager.cpp b/score/launch_manager/src/daemon/src/process_group_manager/details/process_group_manager.cpp index 79dccd544..da654f66f 100644 --- a/score/launch_manager/src/daemon/src/process_group_manager/details/process_group_manager.cpp +++ b/score/launch_manager/src/daemon/src/process_group_manager/details/process_group_manager.cpp @@ -320,8 +320,10 @@ bool ProcessGroupManager::run() while (!em_cancelled.load()) { // Wait for something to happen... - const auto osal_result = - ControlClientChannel::nudgeControlClientHandler_->timedWait(std::chrono::milliseconds(100)); + // The wait is kept below the minimum watchdog timeout so that the wait plus per-iteration + // processing stays within budget for servicing the watchdog each cycle. + const auto osal_result = ControlClientChannel::nudgeControlClientHandler_->timedWait( + std::chrono::milliseconds(score::lcm::internal::kMainLoopCycleTimeMs)); SCORE_LANGUAGE_FUTURECPP_ASSERT_MESSAGE( osal_result == OsalReturnType::kSuccess || osal_result == OsalReturnType::kTimeout, diff --git a/score/launch_manager/src/daemon/src/watchdog/IWatchdogIf.hpp b/score/launch_manager/src/daemon/src/watchdog/IWatchdogIf.hpp index 58fef1f18..e957bd39e 100644 --- a/score/launch_manager/src/daemon/src/watchdog/IWatchdogIf.hpp +++ b/score/launch_manager/src/daemon/src/watchdog/IWatchdogIf.hpp @@ -15,10 +15,15 @@ #ifndef IWATCHDOGIF_HPP_INCLUDED #define IWATCHDOGIF_HPP_INCLUDED +#include "score/mw/launch_manager/common/constants.hpp" + #include #include -#include "score/mw/launch_manager/watchdog/IDeviceConfigFactory.hpp" +namespace score::mw::launch_manager::configuration +{ +struct WatchdogConfig; +} namespace score { @@ -49,6 +54,11 @@ class IWatchdogIf /// @brief Maximum supported timeout value in ms static constexpr std::uint16_t kTimeoutMaxMillis{30U /*seconds*/ * 1000U /*millis per second*/}; + /// The main loop cycle time must be strictly less than the minimum watchdog timeout to ensure that + /// the watchdog timeout cannot expire during an unblocked run of the main loop. + static_assert(score::lcm::internal::kMainLoopCycleTimeMs < kTimeoutMinMillis, + "Main loop cycle time must be less than the minimum watchdog timeout"); + /// @brief Destructor. /* RULECHECKER_comment(0, 2, check_min_instructions, "Default destructor has no body", true_no_defect) */ virtual ~IWatchdogIf() noexcept = default; @@ -62,11 +72,13 @@ class IWatchdogIf /// @note Method is not reentrant safe. /// @note Only simple watchdogs are supported as of now, no windows watchdog (i.e. the min timeout value is always /// assumed 0). - /// @param[in] f_cycleTimeInNs The cycle time in nanoseconds in which serviceWatchdog() will be called - /// @param[in] f_configFactory The factory for retrieving the watchdog configuration(s) + /// @param[in] watchdog_config The configuration for the watchdog + /// @param[in] cycle_time_ns The period in nanoseconds at which serviceWatchdog() is called; used to validate + /// that the configured watchdog timeout is long enough to be serviced in time. /// @return Status of configuration. True all device configurations are valid and has been successfully taken over /// by the Watchdog Interface library, false otherwise. - virtual bool init(std::int64_t f_cycleTimeInNs, const IDeviceConfigFactory& f_configFactory) noexcept = 0; + virtual bool init(const score::mw::launch_manager::configuration::WatchdogConfig& watchdog_config, + std::int64_t cycle_time_ns) noexcept = 0; /// @brief Activate the watchdogs. /// @details Initialize and activate all watchdogs which are configured for use by the Watchdog Interface library. diff --git a/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp b/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp index 356419e6c..d0c6a4e2d 100644 --- a/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp +++ b/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp @@ -20,6 +20,7 @@ #include #include "score/mw/launch_manager/alive_monitor/details/timers/OsClockInterface.hpp" +#include "score/mw/launch_manager/configuration/config.hpp" #include "score/mw/launch_manager/watchdog/details/DeviceIf.hpp" #include "score/mw/launch_manager/watchdog/details/Watchdog.hpp" @@ -55,31 +56,32 @@ T secToMs(const T f_timeout) /* RULECHECKER_comment(0:0,9:0, check_min_instructions, "Constructor with empty body is valid", true_no_defect) */ WatchdogImpl::WatchdogImpl() noexcept : IWatchdogIf(), watchdogDevices(), state(ELibState::idle) {} -bool WatchdogImpl::init(std::int64_t f_cycleTimeInNs, const IDeviceConfigFactory& f_configFactory) noexcept +bool WatchdogImpl::init(const score::mw::launch_manager::configuration::WatchdogConfig& watchdog_config, + std::int64_t cycle_time_ns) noexcept { bool isSuccess{true}; try { - const auto configurations{f_configFactory.getDeviceConfigurations()}; - if (!configurations) + if (watchdog_config.max_timeout_ms > std::numeric_limits::max()) { - LM_LOG_ERROR() << "Watchdog: Invalid watchdog device configuration. Watchdog initialization failed."; - isSuccess = false; + LM_LOG_ERROR() << "Watchdog: Invalid watchdog timeout value " << watchdog_config.max_timeout_ms + << "ms. Watchdog initialization failed."; + return false; } - if (isSuccess) - { - watchdogDevices.reserve(configurations->size()); + // Translate WatchdogConfig to DeviceConfig + DeviceConfig config{}; + config.fileName = watchdog_config.device_file_path; + config.timeoutMin = 0U; + config.timeoutMax = static_cast(watchdog_config.max_timeout_ms); + config.canBeDeactivated = watchdog_config.deactivate_on_shutdown; + config.needsMagicClose = watchdog_config.require_magic_close; - for (auto& config : *configurations) - { - if (!configureDevice(config, f_cycleTimeInNs)) - { - LM_LOG_ERROR() << "Watchdog: Error when configuring watchdog device" << config.fileName - << "- Watchdog initialization failed."; - isSuccess = false; - } - } + if (!configureDevice(config, cycle_time_ns)) + { + LM_LOG_ERROR() << "Watchdog: Error when configuring watchdog device " << config.fileName + << " - Watchdog initialization failed."; + isSuccess = false; } } catch (const std::exception& e) diff --git a/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.hpp b/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.hpp index 7302ad867..0364f97f3 100644 --- a/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.hpp +++ b/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.hpp @@ -57,7 +57,8 @@ class WatchdogImpl : public IWatchdogIf ~WatchdogImpl() override = default; /// @copydoc IWatchdogIf::init() - bool init(std::int64_t f_cycleTimeInNs, const IDeviceConfigFactory& f_configFactory) noexcept override; + bool init(const score::mw::launch_manager::configuration::WatchdogConfig& watchdog_config, + std::int64_t cycle_time_ns) noexcept override; /// @copydoc IWatchdogIf::enable() bool enable() noexcept override; From e05fce7b27811738c6ebd0ec742647afe969bf79 Mon Sep 17 00:00:00 2001 From: Cameron Craig Date: Thu, 23 Jul 2026 12:30:11 +0000 Subject: [PATCH 07/14] chore: Clean up unused includes and dependencies --- score/launch_manager/src/daemon/BUILD | 1 - score/launch_manager/src/daemon/src/main.cpp | 2 +- .../src/daemon/src/process_group_manager/BUILD | 1 - .../process_group_manager/process_group_manager.hpp | 10 +++++----- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/score/launch_manager/src/daemon/BUILD b/score/launch_manager/src/daemon/BUILD index 87c307816..272b0d089 100644 --- a/score/launch_manager/src/daemon/BUILD +++ b/score/launch_manager/src/daemon/BUILD @@ -37,7 +37,6 @@ cc_binary( "@score_baselibs//score/language/futurecpp", ] + select({ "//config:lm_use_new_configuration": [ - "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:machine_config_factory", "//score/launch_manager/src/daemon/src/configuration:flatbuffer_config_loader", "//score/launch_manager/src/daemon/src/watchdog/details:watchdog_impl", ], diff --git a/score/launch_manager/src/daemon/src/main.cpp b/score/launch_manager/src/daemon/src/main.cpp index 2ff06bc2c..82b9fc9f5 100644 --- a/score/launch_manager/src/daemon/src/main.cpp +++ b/score/launch_manager/src/daemon/src/main.cpp @@ -18,7 +18,7 @@ #include "score/mw/launch_manager/common/log.hpp" #include "score/mw/launch_manager/alive_monitor/details/daemon/AliveMonitorImpl.hpp" -#include "score/mw/launch_manager/watchdog/details/WatchdogImpl.hpp" +#include "score/mw/launch_manager/watchdog/IWatchdogIf.hpp" #include "score/mw/launch_manager/process_group_manager/alive_monitor_thread.hpp" #include "score/mw/launch_manager/process_group_manager/process_group_manager.hpp" #include "score/mw/launch_manager/process_state_client/process_state_notifier.hpp" diff --git a/score/launch_manager/src/daemon/src/process_group_manager/BUILD b/score/launch_manager/src/daemon/src/process_group_manager/BUILD index e94bd0b85..33ac2aafa 100644 --- a/score/launch_manager/src/daemon/src/process_group_manager/BUILD +++ b/score/launch_manager/src/daemon/src/process_group_manager/BUILD @@ -71,7 +71,6 @@ cc_library( "//score/launch_manager/src/daemon/src/process_group_manager/details:safe_process_map", "//score/launch_manager/src/daemon/src/process_state_client:iprocess_state_notifier", "//score/launch_manager/src/daemon/src/recovery_client", - "//score/launch_manager/src/daemon/src/watchdog:i_device_config_factory", "//score/launch_manager/src/daemon/src/watchdog:i_watchdog_if", "@score_baselibs//score/language/futurecpp", ] + select({ diff --git a/score/launch_manager/src/daemon/src/process_group_manager/process_group_manager.hpp b/score/launch_manager/src/daemon/src/process_group_manager/process_group_manager.hpp index 38c7a1f9b..df61a7dce 100644 --- a/score/launch_manager/src/daemon/src/process_group_manager/process_group_manager.hpp +++ b/score/launch_manager/src/daemon/src/process_group_manager/process_group_manager.hpp @@ -26,17 +26,17 @@ #else #include "score/mw/launch_manager/configuration/configuration_manager.hpp" #endif -#include "score/mw/launch_manager/process_group_manager/iprocess.hpp" -#include "score/mw/launch_manager/process_group_manager/details/graph.hpp" #include "score/mw/launch_manager/common/concurrency/mpmc_concurrent_queue.hpp" +#include "score/mw/launch_manager/common/concurrency/workerthread.hpp" +#include "score/mw/launch_manager/common/constants.hpp" +#include "score/mw/launch_manager/process_group_manager/details/graph.hpp" #include "score/mw/launch_manager/process_group_manager/details/os_handler.hpp" -#include "score/mw/launch_manager/process_state_client/iprocess_state_notifier.hpp" #include "score/mw/launch_manager/process_group_manager/details/process_info_node.hpp" #include "score/mw/launch_manager/process_group_manager/details/safe_process_map.hpp" -#include "score/mw/launch_manager/common/concurrency/workerthread.hpp" #include "score/mw/launch_manager/process_group_manager/ialive_monitor_thread.hpp" +#include "score/mw/launch_manager/process_group_manager/iprocess.hpp" +#include "score/mw/launch_manager/process_state_client/iprocess_state_notifier.hpp" #include "score/mw/launch_manager/recovery_client/recovery_client.hpp" -#include "score/mw/launch_manager/watchdog/IDeviceConfigFactory.hpp" #include "score/mw/launch_manager/watchdog/IWatchdogIf.hpp" namespace score::lcm::internal From 212333bbb738afb3c85318b2c2629a7140bd276c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Fu=C3=9Fberger?= Date: Mon, 3 Aug 2026 06:46:01 +0000 Subject: [PATCH 08/14] Move device factory to details --- .../src/daemon/src/alive_monitor/details/factory/BUILD | 4 ++-- score/launch_manager/src/daemon/src/watchdog/BUILD | 9 --------- .../src/daemon/src/watchdog/details/BUILD | 10 +++++++++- .../watchdog/{ => details}/IDeviceConfigFactory.hpp | 0 .../src/daemon/src/watchdog/details/WatchdogImpl.cpp | 4 ++-- 5 files changed, 13 insertions(+), 14 deletions(-) rename score/launch_manager/src/daemon/src/watchdog/{ => details}/IDeviceConfigFactory.hpp (100%) diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD index a19ba40c0..47c7e7a2f 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD @@ -32,7 +32,7 @@ cc_library( deps = [ "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:data_structures", "//score/launch_manager/src/daemon/src/alive_monitor/details/timers:timers_os_clock", - "//score/launch_manager/src/daemon/src/watchdog:i_device_config_factory", + "//score/launch_manager/src/daemon/src/watchdog/details:i_device_config_factory", ], ) @@ -56,7 +56,7 @@ cc_library( "//score/launch_manager/src/daemon/src/alive_monitor/details/timers:time_conversion", "//score/launch_manager/src/daemon/src/alive_monitor/details/timers:timers_os_clock", "//score/launch_manager/src/daemon/src/common:log", - "//score/launch_manager/src/daemon/src/watchdog:i_device_config_factory", + "//score/launch_manager/src/daemon/src/watchdog/details:i_device_config_factory", "@score_baselibs//score/flatbuffers:flatbufferscpp", "@score_baselibs//score/language/futurecpp", ] + select({ diff --git a/score/launch_manager/src/daemon/src/watchdog/BUILD b/score/launch_manager/src/daemon/src/watchdog/BUILD index 3b54e7b1e..89c092eb2 100644 --- a/score/launch_manager/src/daemon/src/watchdog/BUILD +++ b/score/launch_manager/src/daemon/src/watchdog/BUILD @@ -12,14 +12,6 @@ # ******************************************************************************* load("@rules_cc//cc:defs.bzl", "cc_library") -cc_library( - name = "i_device_config_factory", - hdrs = ["IDeviceConfigFactory.hpp"], - include_prefix = "score/mw/launch_manager/watchdog", - strip_include_prefix = "/score/launch_manager/src/daemon/src/watchdog", - visibility = ["//score:__subpackages__"], -) - cc_library( name = "i_watchdog_if", hdrs = ["IWatchdogIf.hpp"], @@ -27,7 +19,6 @@ cc_library( strip_include_prefix = "/score/launch_manager/src/daemon/src/watchdog", visibility = ["//score:__subpackages__"], deps = [ - ":i_device_config_factory", "//score/launch_manager/src/daemon/src/common:constants", ], ) diff --git a/score/launch_manager/src/daemon/src/watchdog/details/BUILD b/score/launch_manager/src/daemon/src/watchdog/details/BUILD index 7f5dc12fa..bdebc8c64 100644 --- a/score/launch_manager/src/daemon/src/watchdog/details/BUILD +++ b/score/launch_manager/src/daemon/src/watchdog/details/BUILD @@ -12,6 +12,14 @@ # ******************************************************************************* load("@rules_cc//cc:defs.bzl", "cc_library") +cc_library( + name = "i_device_config_factory", + hdrs = ["IDeviceConfigFactory.hpp"], + include_prefix = "score/mw/launch_manager/watchdog", + strip_include_prefix = "/score/launch_manager/src/daemon/src/watchdog/details", + visibility = ["//score:__subpackages__"], +) + cc_library( name = "watchdog", hdrs = ["Watchdog.hpp"], @@ -43,7 +51,7 @@ cc_library( "//score/launch_manager/src/daemon/src/alive_monitor/details/timers:os_clock_interface", "//score/launch_manager/src/daemon/src/common:log", "//score/launch_manager/src/daemon/src/configuration:config", - "//score/launch_manager/src/daemon/src/watchdog:i_device_config_factory", + "//score/launch_manager/src/daemon/src/watchdog/details:i_device_config_factory", "//score/launch_manager/src/daemon/src/watchdog:i_watchdog_if", "@score_baselibs//score/language/futurecpp", ], diff --git a/score/launch_manager/src/daemon/src/watchdog/IDeviceConfigFactory.hpp b/score/launch_manager/src/daemon/src/watchdog/details/IDeviceConfigFactory.hpp similarity index 100% rename from score/launch_manager/src/daemon/src/watchdog/IDeviceConfigFactory.hpp rename to score/launch_manager/src/daemon/src/watchdog/details/IDeviceConfigFactory.hpp diff --git a/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp b/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp index d0c6a4e2d..6fda093b4 100644 --- a/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp +++ b/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp @@ -64,7 +64,7 @@ bool WatchdogImpl::init(const score::mw::launch_manager::configuration::Watchdog { if (watchdog_config.max_timeout_ms > std::numeric_limits::max()) { - LM_LOG_ERROR() << "Watchdog: Invalid watchdog timeout value " << watchdog_config.max_timeout_ms + LM_LOG_ERROR() << "Watchdog: Invalid watchdog timeout value" << watchdog_config.max_timeout_ms << "ms. Watchdog initialization failed."; return false; } @@ -79,7 +79,7 @@ bool WatchdogImpl::init(const score::mw::launch_manager::configuration::Watchdog if (!configureDevice(config, cycle_time_ns)) { - LM_LOG_ERROR() << "Watchdog: Error when configuring watchdog device " << config.fileName + LM_LOG_ERROR() << "Watchdog: Error when configuring watchdog device" << config.fileName << " - Watchdog initialization failed."; isSuccess = false; } From 4808754f424584dfcf9dcf7a721c03458d0de8d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Fu=C3=9Fberger?= Date: Mon, 3 Aug 2026 07:31:26 +0000 Subject: [PATCH 09/14] Remove watchdog code from factory --- .../src/alive_monitor/details/daemon/BUILD | 1 + .../details/daemon/PhmDaemon.hpp | 14 +++-- .../details/daemon/SwClusterHandler.cpp | 2 +- .../details/daemon/SwClusterHandler.hpp | 2 +- .../src/alive_monitor/details/factory/BUILD | 1 - .../details/factory/FlatCfgFactory.cpp | 2 +- .../details/factory/FlatCfgFactory.hpp | 4 +- .../details/factory/FlatCfgFactory_new.cpp | 2 +- .../details/factory/MachineConfigFactory.cpp | 63 +------------------ .../details/factory/MachineConfigFactory.hpp | 27 +------- .../factory/MachineConfigFactory_new.cpp | 39 +----------- .../details/factory/StaticConfig.hpp | 10 +++ 12 files changed, 34 insertions(+), 133 deletions(-) diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD index 4e28edbda..c48371727 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD @@ -65,6 +65,7 @@ cc_library( ":phm_daemon_config", ":sw_cluster_handler", "//score/launch_manager/src/control_client", + "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:static_config", "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:flat_cfg_factory", "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:machine_config_factory", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:monitor_if_daemon", diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp index 3d8ec97b0..4383956e7 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp @@ -25,6 +25,7 @@ #include "score/mw/launch_manager/alive_monitor/details/ifexm/ProcessStateReader.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/CycleTimeValidator.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/CycleTimer.hpp" +#include "score/mw/launch_manager/alive_monitor/details/factory/StaticConfig.hpp" #ifdef USE_NEW_CONFIGURATION #include "score/mw/launch_manager/configuration/config.hpp" #endif @@ -60,7 +61,7 @@ class PhmDaemon using ProcessStateReceiver = score::lcm::IProcessStateReceiver; using RecoveryClient = score::lcm::IRecoveryClient; using MachineConfigFactory = factory::MachineConfigFactory; - using SupervisionBufferConfig = MachineConfigFactory::SupervisionBufferConfig; + using SupervisionBufferConfig = factory::SupervisionBufferConfig; using CycleTimer = score::lcm::saf::timers::CycleTimer; using CycleTimeValidator = score::lcm::saf::timers::CycleTimeValidator; using NanoSecondType = score::lcm::saf::timers::NanoSecondType; @@ -108,7 +109,12 @@ class PhmDaemon return EInitCode::kMachineConfigInitFailed; } - if (!construct(config, machineConfig.getSupervisionBufferConfig())) + if (!construct(config, factory::StaticConfig::kDefaultSupervisionBufferConfig)) + { + return EInitCode::kConstructFlatCfgFactoryFailed; + } + + int64_t cycleTimeModified{static_cast(config.aliveSupervision().evaluation_cycle_ms)}; #else EInitCode init(std::shared_ptr recovery_client) noexcept(false) { @@ -120,13 +126,13 @@ class PhmDaemon return EInitCode::kMachineConfigInitFailed; } - if (!construct(machineConfig.getSupervisionBufferConfig())) -#endif + if (!construct(factory::StaticConfig::kDefaultSupervisionBufferConfig)) { return EInitCode::kConstructFlatCfgFactoryFailed; } int64_t cycleTimeModified{static_cast(machineConfig.getCycleTimeInNs())}; +#endif cycleTimeModified = CycleTimeValidator::adjustCycleTimeOnClockAccuracy(cycleTimeModified, osClock); diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/SwClusterHandler.cpp b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/SwClusterHandler.cpp index f59785cb0..0de44cbac 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/SwClusterHandler.cpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/SwClusterHandler.cpp @@ -51,7 +51,7 @@ bool SwClusterHandler::constructWorkers( #endif std::shared_ptr f_recoveryClient_r, ifexm::ProcessStateReader& f_processStateReader_r, - const factory::MachineConfigFactory::SupervisionBufferConfig& f_bufferConfig_r) noexcept(false) + const factory::SupervisionBufferConfig& f_bufferConfig_r) noexcept(false) { bool isSuccess{false}; factory::FlatCfgFactory flatCfgFactory{f_bufferConfig_r}; diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/SwClusterHandler.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/SwClusterHandler.hpp index c5ce384fe..542e41425 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/SwClusterHandler.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/SwClusterHandler.hpp @@ -99,7 +99,7 @@ class SwClusterHandler #endif std::shared_ptr f_recoveryClient_r, ifexm::ProcessStateReader& f_processStateReader_r, - const factory::MachineConfigFactory::SupervisionBufferConfig& f_bufferConfig_r) noexcept(false); + const factory::SupervisionBufferConfig& f_bufferConfig_r) noexcept(false); /// @brief Perform cyclic execution /// @details Perform cyclic execution required for supervision of the Software Cluster diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD index 47c7e7a2f..40f75ec6b 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD @@ -56,7 +56,6 @@ cc_library( "//score/launch_manager/src/daemon/src/alive_monitor/details/timers:time_conversion", "//score/launch_manager/src/daemon/src/alive_monitor/details/timers:timers_os_clock", "//score/launch_manager/src/daemon/src/common:log", - "//score/launch_manager/src/daemon/src/watchdog/details:i_device_config_factory", "@score_baselibs//score/flatbuffers:flatbufferscpp", "@score_baselibs//score/language/futurecpp", ] + select({ diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory.cpp b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory.cpp index 909015c0b..1cc1bdd2b 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory.cpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory.cpp @@ -38,7 +38,7 @@ namespace saf namespace factory { -using BufferConfig = MachineConfigFactory::SupervisionBufferConfig; +using BufferConfig = SupervisionBufferConfig; using RecoveryClient = score::lcm::IRecoveryClient; using NanoSecondType = saf::timers::NanoSecondType; using IdentifierHash = score::lcm::IdentifierHash; diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory.hpp index c3711b23b..af6a3c760 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory.hpp @@ -54,7 +54,7 @@ class FlatCfgFactory : public IPhmFactory public: /// @brief Constructor /// @param [in] f_bufferConfig_r Buffer configuration used for constructing supervisions - explicit FlatCfgFactory(const factory::MachineConfigFactory::SupervisionBufferConfig& f_bufferConfig_r); + explicit FlatCfgFactory(const factory::SupervisionBufferConfig& f_bufferConfig_r); /// @brief Destructor /* RULECHECKER_comment(0, 5, check_min_instructions, "Default destructor is not provided\ @@ -128,7 +128,7 @@ class FlatCfgFactory : public IPhmFactory const std::int32_t f_uid) noexcept(false); /// @brief The buffer configuration for constructing supervision objects - const factory::MachineConfigFactory::SupervisionBufferConfig& bufferConfig_r; + const factory::SupervisionBufferConfig& bufferConfig_r; #ifdef USE_NEW_CONFIGURATION const score::mw::launch_manager::configuration::Config* config_; diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory_new.cpp b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory_new.cpp index 75efbc39c..86c292d4b 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory_new.cpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory_new.cpp @@ -35,7 +35,7 @@ namespace lcm { namespace saf { namespace factory { -using BufferConfig = MachineConfigFactory::SupervisionBufferConfig; +using BufferConfig = SupervisionBufferConfig; using Config = score::mw::launch_manager::configuration::Config; using ComponentConfig = score::mw::launch_manager::configuration::ComponentConfig; using ApplicationType = score::mw::launch_manager::configuration::ApplicationType; diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory.cpp b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory.cpp index 67110ac43..b2a2048d5 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory.cpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory.cpp @@ -32,7 +32,6 @@ namespace factory { using HMCoreEcuCfg = HMCOREFlatBuffer::HMCOREEcuCfg; -using DeviceConfigurations = watchdog::IDeviceConfigFactory::DeviceConfigurations; using NanoSecondType = timers::NanoSecondType; namespace @@ -76,7 +75,7 @@ std::unique_ptr read_flatbuffer_file(const std::string& f_filename_r) } } // namespace -MachineConfigFactory::MachineConfigFactory() noexcept(true) : watchdog::IDeviceConfigFactory() {} +MachineConfigFactory::MachineConfigFactory() noexcept(true) {} bool MachineConfigFactory::init() noexcept(false) { @@ -103,45 +102,11 @@ bool MachineConfigFactory::init() noexcept(false) bool MachineConfigFactory::loadHmCoreConfig(const HMCoreEcuCfg* f_cfg_r) noexcept(false) { loadHmSettings(*f_cfg_r); - loadWatchdogDevices(*f_cfg_r); LM_LOG_INFO() << kLogPrefix << "Loading of HM Machine Configuration succeeded."; logConfiguration(); return true; } -void MachineConfigFactory::loadWatchdogDevices(const HMCoreEcuCfg& f_flatBuffer_r) noexcept(false) -{ - const auto* watchdogs{f_flatBuffer_r.watchdogs()}; - if ((watchdogs == nullptr) || (watchdogs->size() == 0U)) - { - // no watchdog devices configured - return; - } - - watchdogConfigs.reserve(static_cast(watchdogs->size())); - for (const auto& wdg : *watchdogs) - { - watchdog::DeviceConfig config{}; - - SCORE_LANGUAGE_FUTURECPP_ASSERT_PRD(wdg->maxTimeout() <= std::numeric_limits::max()); - // coverity[autosar_cpp14_a4_7_1_violation] SDG definitions guarantee uint16 boundaries - config.timeoutMax = static_cast(wdg->maxTimeout()); - - // coverity[cert_exp34_c_violation] HMCORE.ecucfgdsl Watchdog.deviceFilePath MANDATORY - // coverity[dereference] HMCORE.ecucfgdsl Watchdog.deviceFilePath MANDATORY - config.fileName = wdg->deviceFilePath()->str(); - if (wdg->hasValueDeactivateOnShutdown()) - { - config.canBeDeactivated = wdg->deactivateOnShutdown(); - } - if (wdg->hasValueRequireMagicClose()) - { - config.needsMagicClose = wdg->requireMagicClose(); - } - watchdogConfigs.push_back(std::move(config)); - } -} - void MachineConfigFactory::loadHmSettings(const HMCoreEcuCfg& f_flatBuffer_r) noexcept(true) { const auto* configContainer{f_flatBuffer_r.config()}; @@ -168,17 +133,12 @@ void MachineConfigFactory::loadHmSettings(const HMCoreEcuCfg& f_flatBuffer_r) no } } -std::optional MachineConfigFactory::getDeviceConfigurations() const -{ - return watchdogConfigs; -} - NanoSecondType MachineConfigFactory::getCycleTimeInNs() const noexcept(true) { return cycleTimeNs; } -const MachineConfigFactory::SupervisionBufferConfig& MachineConfigFactory::getSupervisionBufferConfig() const +const SupervisionBufferConfig& MachineConfigFactory::getSupervisionBufferConfig() const noexcept(true) { return supBufferCfg; @@ -191,25 +151,6 @@ void MachineConfigFactory::logConfiguration() noexcept(true) LM_LOG_DEBUG() << kLogPrefix << "Alive Supervision buffer size:" << supBufferCfg.bufferSizeAliveSupervision; LM_LOG_DEBUG() << kLogPrefix << "Monitor buffer size:" << supBufferCfg.bufferSizeMonitor; LM_LOG_DEBUG() << kLogPrefix << "Periodicity:" << getCycleTimeInNs() << "ns"; - LM_LOG_DEBUG() << kLogPrefix << "Configured watchdogs:" << watchdogConfigs.size(); - std::uint32_t wdgCount{1U}; - for (const auto& wdgConfig : watchdogConfigs) - { - const std::string_view wdgMagicCloseBool{wdgConfig.needsMagicClose ? "true" : "false"}; - const std::string_view wdgDeactivatedBool{wdgConfig.canBeDeactivated ? "true" : "false"}; - LM_LOG_DEBUG() << kLogPrefix << "Watchdog" << wdgCount << "- device file:" << wdgConfig.fileName; - LM_LOG_DEBUG() << kLogPrefix << "Watchdog" << wdgCount << "- max timeout:" << wdgConfig.timeoutMax << "ms"; - LM_LOG_DEBUG() << kLogPrefix << "Watchdog" << wdgCount << "- needs magic close:" << wdgMagicCloseBool; - LM_LOG_DEBUG() << kLogPrefix << "Watchdog" << wdgCount << "- deactivate on hm shutdown:" << wdgDeactivatedBool; - // coverity[autosar_cpp14_a4_7_1_violation] Value limited by amount of watchdog configurations, which is - // smaller. - ++wdgCount; - } - - if (watchdogConfigs.empty()) - { - LM_LOG_WARN() << kLogPrefix << "No watchdog configured"; - } } } // namespace factory diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory.hpp index ae2c95666..9ec621095 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory.hpp @@ -18,7 +18,7 @@ #include #include "score/mw/launch_manager/alive_monitor/details/factory/StaticConfig.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/Timers_OsClock.hpp" -#include "score/mw/launch_manager/watchdog/IDeviceConfigFactory.hpp" +#include "score/mw/launch_manager/alive_monitor/details/factory/StaticConfig.hpp" #ifdef USE_NEW_CONFIGURATION #include "score/mw/launch_manager/configuration/config.hpp" #else @@ -42,24 +42,14 @@ namespace factory /// @brief Factory for loading the HM Machine Configuration /// @details Provides methods to retrieve the settings from the HM Machine configuration if a configuration is /// provided. If no configuration is provided, the default values are returned. -class MachineConfigFactory : public watchdog::IDeviceConfigFactory +class MachineConfigFactory { public: - /// @brief Holds different buffer sizes that may be configured in the HM Machine Config - /// @details All buffer sizes are initialized with their default value - struct SupervisionBufferConfig - { - /// @brief Configured buffer size for alive supervisions - std::uint16_t bufferSizeAliveSupervision{StaticConfig::k_DefaultAliveSupCheckpointBufferElements}; - /// @brief Configured buffer size for Monitor entities - std::uint16_t bufferSizeMonitor{StaticConfig::k_DefaultMonitorBufferElements}; - }; - /// @brief Constructor MachineConfigFactory() noexcept(true); /// @brief Destructor - ~MachineConfigFactory() override = default; + ~MachineConfigFactory() = default; /// @brief No Copy Constructor MachineConfigFactory(const MachineConfigFactory&) = delete; @@ -81,9 +71,6 @@ class MachineConfigFactory : public watchdog::IDeviceConfigFactory bool init() noexcept(false); #endif - /// @copydoc IDeviceConfigFactory::getDeviceConfigurations() - std::optional getDeviceConfigurations() const override; - /// @brief Returns the configured hm daemon cycle time in nanoseconds /// @return Configured cycle time or default cycle time if not configured timers::NanoSecondType getCycleTimeInNs() const noexcept(true); @@ -100,10 +87,6 @@ class MachineConfigFactory : public watchdog::IDeviceConfigFactory /// @return true if no error occurred, else false bool loadHmCoreConfig(const HMCOREFlatBuffer::HMCOREEcuCfg* f_cfg_r) noexcept(false); - /// @brief Loads the watchdog device configuration from machine config - /// @param [in] f_flatBuffer_r The loaded machine config - void loadWatchdogDevices(const HMCOREFlatBuffer::HMCOREEcuCfg& f_flatBuffer_r) noexcept(false); - /// @brief Load HM settings from the machine config. I.e. buffer sizes, periodicity, etc. /// @param [in] f_flatBuffer_r The flatcfg buffer void loadHmSettings(const HMCOREFlatBuffer::HMCOREEcuCfg& f_flatBuffer_r) noexcept(true); @@ -112,10 +95,6 @@ class MachineConfigFactory : public watchdog::IDeviceConfigFactory /// @brief Log all configuration settings void logConfiguration() noexcept(true); - /// @brief Configured watchdog devices - /// By default, no watchdog device is configured - watchdog::IDeviceConfigFactory::DeviceConfigurations watchdogConfigs{}; - /// @brief Configured HM Daemon cycle time timers::NanoSecondType cycleTimeNs{StaticConfig::k_hmDaemonDefaultCycleTime}; diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory_new.cpp b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory_new.cpp index b2b31b107..2de3bf4d3 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory_new.cpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory_new.cpp @@ -28,7 +28,6 @@ namespace factory { using Config = score::mw::launch_manager::configuration::Config; -using DeviceConfigurations = watchdog::IDeviceConfigFactory::DeviceConfigurations; using NanoSecondType = timers::NanoSecondType; namespace @@ -36,7 +35,7 @@ namespace static constexpr const std::string_view kLogPrefix{"Factory for FlatCfg MachineConfig:"}; } // namespace -MachineConfigFactory::MachineConfigFactory() noexcept(true) : watchdog::IDeviceConfigFactory() +MachineConfigFactory::MachineConfigFactory() noexcept(true) { } @@ -46,34 +45,17 @@ bool MachineConfigFactory::init(const Config& config) noexcept(false) assert(alive_sup.evaluation_cycle_ms != 0U && "evaluation_cycle_ms must not be zero"); cycleTimeNs = timers::TimeConversion::convertMilliSecToNanoSec(static_cast(alive_sup.evaluation_cycle_ms)); - const auto& wd_opt = config.watchdog(); - if (wd_opt.has_value()) - { - const auto& wd = *wd_opt; - watchdog::DeviceConfig wdConfig{}; - wdConfig.fileName = wd.device_file_path; - wdConfig.timeoutMax = static_cast(wd.max_timeout_ms); - wdConfig.canBeDeactivated = wd.deactivate_on_shutdown; - wdConfig.needsMagicClose = wd.require_magic_close; - watchdogConfigs.push_back(std::move(wdConfig)); - } - LM_LOG_INFO() << kLogPrefix << "Loading of HM Machine Configuration succeeded."; logConfiguration(); return true; } -std::optional MachineConfigFactory::getDeviceConfigurations() const -{ - return watchdogConfigs; -} - NanoSecondType MachineConfigFactory::getCycleTimeInNs() const noexcept(true) { return cycleTimeNs; } -const MachineConfigFactory::SupervisionBufferConfig& MachineConfigFactory::getSupervisionBufferConfig() const +const SupervisionBufferConfig& MachineConfigFactory::getSupervisionBufferConfig() const noexcept(true) { return supBufferCfg; @@ -84,23 +66,6 @@ void MachineConfigFactory::logConfiguration() noexcept(true) LM_LOG_DEBUG() << kLogPrefix << "Alive Supervision buffer size:" << supBufferCfg.bufferSizeAliveSupervision; LM_LOG_DEBUG() << kLogPrefix << "Monitor buffer size:" << supBufferCfg.bufferSizeMonitor; LM_LOG_DEBUG() << kLogPrefix << "Periodicity:" << getCycleTimeInNs() << "ns"; - LM_LOG_DEBUG() << kLogPrefix << "Configured watchdogs:" << watchdogConfigs.size(); - std::uint32_t wdgCount{1U}; - for (const auto& wdgConfig : watchdogConfigs) - { - const std::string_view wdgMagicCloseBool{wdgConfig.needsMagicClose ? "true" : "false"}; - const std::string_view wdgDeactivatedBool{wdgConfig.canBeDeactivated ? "true" : "false"}; - LM_LOG_DEBUG() << kLogPrefix << "Watchdog" << wdgCount << "- device file:" << wdgConfig.fileName; - LM_LOG_DEBUG() << kLogPrefix << "Watchdog" << wdgCount << "- max timeout:" << wdgConfig.timeoutMax << "ms"; - LM_LOG_DEBUG() << kLogPrefix << "Watchdog" << wdgCount << "- needs magic close:" << wdgMagicCloseBool; - LM_LOG_DEBUG() << kLogPrefix << "Watchdog" << wdgCount << "- deactivate on hm shutdown:" << wdgDeactivatedBool; - ++wdgCount; - } - - if (watchdogConfigs.empty()) - { - LM_LOG_WARN() << kLogPrefix << "No watchdog configured"; - } } } // namespace factory diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/StaticConfig.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/StaticConfig.hpp index 446e4c882..4ff393670 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/StaticConfig.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/StaticConfig.hpp @@ -29,6 +29,14 @@ namespace saf namespace factory { +struct SupervisionBufferConfig +{ + /// @brief Configured buffer size for alive supervisions + std::uint16_t bufferSizeAliveSupervision{}; + /// @brief Configured buffer size for Monitor entities + std::uint16_t bufferSizeMonitor{}; +}; + /// @brief Static configurations /// @details Configuration parameters which are currently not extracted from the configuration /// and default parameters values for optional configurations. @@ -47,6 +55,8 @@ class StaticConfig static constexpr bool k_hmDaemonDefaultShutdownEnabled{false}; /// @brief By default, 10ms cycle time is used static constexpr timers::NanoSecondType k_hmDaemonDefaultCycleTime{10000000U}; + + static constexpr SupervisionBufferConfig kDefaultSupervisionBufferConfig{StaticConfig::k_DefaultAliveSupCheckpointBufferElements, StaticConfig::k_DefaultMonitorBufferElements}; }; } // namespace factory From 36b46297d38dc854a98ab69463813940760623ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Fu=C3=9Fberger?= Date: Mon, 3 Aug 2026 07:42:08 +0000 Subject: [PATCH 10/14] Remove MachineConfigFactory_new --- .../src/alive_monitor/details/daemon/BUILD | 5 +- .../details/daemon/PhmDaemon.hpp | 12 ++- .../src/alive_monitor/details/factory/BUILD | 11 +-- .../details/factory/MachineConfigFactory.hpp | 14 +--- .../factory/MachineConfigFactory_new.cpp | 74 ------------------- 5 files changed, 10 insertions(+), 106 deletions(-) delete mode 100644 score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory_new.cpp diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD index c48371727..a2e53b8ff 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD @@ -67,7 +67,6 @@ cc_library( "//score/launch_manager/src/control_client", "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:static_config", "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:flat_cfg_factory", - "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:machine_config_factory", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:monitor_if_daemon", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifexm:process_state_reader", "//score/launch_manager/src/daemon/src/alive_monitor/details/supervision:alive", @@ -80,7 +79,9 @@ cc_library( "//config:lm_use_new_configuration": [ "//score/launch_manager/src/daemon/src/configuration:config", ], - "//conditions:default": [], + "//conditions:default": [ + "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:machine_config_factory", + ], }), ) diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp index 4383956e7..832cbdc32 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp @@ -25,6 +25,7 @@ #include "score/mw/launch_manager/alive_monitor/details/ifexm/ProcessStateReader.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/CycleTimeValidator.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/CycleTimer.hpp" +#include "score/mw/launch_manager/alive_monitor/details/timers/TimeConversion.hpp" #include "score/mw/launch_manager/alive_monitor/details/factory/StaticConfig.hpp" #ifdef USE_NEW_CONFIGURATION #include "score/mw/launch_manager/configuration/config.hpp" @@ -60,7 +61,9 @@ class PhmDaemon using OsClock = score::lcm::saf::timers::OsClockInterface; using ProcessStateReceiver = score::lcm::IProcessStateReceiver; using RecoveryClient = score::lcm::IRecoveryClient; +#ifndef USE_NEW_CONFIGURATION using MachineConfigFactory = factory::MachineConfigFactory; +#endif using SupervisionBufferConfig = factory::SupervisionBufferConfig; using CycleTimer = score::lcm::saf::timers::CycleTimer; using CycleTimeValidator = score::lcm::saf::timers::CycleTimeValidator; @@ -103,18 +106,13 @@ class PhmDaemon { recoveryClient = recovery_client; - MachineConfigFactory machineConfig{}; - if (!machineConfig.init(config)) - { - return EInitCode::kMachineConfigInitFailed; - } - if (!construct(config, factory::StaticConfig::kDefaultSupervisionBufferConfig)) { return EInitCode::kConstructFlatCfgFactoryFailed; } - int64_t cycleTimeModified{static_cast(config.aliveSupervision().evaluation_cycle_ms)}; + int64_t cycleTimeModified{ + static_cast(timers::TimeConversion::convertMilliSecToNanoSec(config.aliveSupervision().evaluation_cycle_ms))}; #else EInitCode init(std::shared_ptr recovery_client) noexcept(false) { diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD index 40f75ec6b..d1655dcf0 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD @@ -39,14 +39,10 @@ cc_library( cc_library( name = "machine_config_factory", srcs = select({ - "//config:lm_use_new_configuration": ["MachineConfigFactory_new.cpp"], + "//config:lm_use_new_configuration": [], "//conditions:default": ["MachineConfigFactory.cpp"], }), hdrs = ["MachineConfigFactory.hpp"], - defines = select({ - "//config:lm_use_new_configuration": ["USE_NEW_CONFIGURATION"], - "//conditions:default": [], - }), include_prefix = "score/mw/launch_manager/alive_monitor/details/factory", strip_include_prefix = "/score/launch_manager/src/daemon/src/alive_monitor/details/factory", visibility = ["//score/launch_manager/src/daemon:__subpackages__"], @@ -59,11 +55,6 @@ cc_library( "@score_baselibs//score/flatbuffers:flatbufferscpp", "@score_baselibs//score/language/futurecpp", ] + select({ - "//config:lm_use_new_configuration": [ - "//score/launch_manager/src/daemon/src/configuration:config", - ], - "//conditions:default": [], - }) + select({ "@platforms//os:qnx": [], "@platforms//os:linux": ["//externals/acl"], }), diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory.hpp index 9ec621095..659abeef1 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory.hpp @@ -15,19 +15,15 @@ #ifndef MACHINE_CONFIG_FACTORY_HPP_INCLUDED #define MACHINE_CONFIG_FACTORY_HPP_INCLUDED -#include #include "score/mw/launch_manager/alive_monitor/details/factory/StaticConfig.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/Timers_OsClock.hpp" #include "score/mw/launch_manager/alive_monitor/details/factory/StaticConfig.hpp" -#ifdef USE_NEW_CONFIGURATION -#include "score/mw/launch_manager/configuration/config.hpp" -#else + namespace HMCOREFlatBuffer { /* RULECHECKER_comment(1:0,1:0, check_non_pod_struct, "External data type form generated flatbuffer code", true_no_defect) */ struct HMCOREEcuCfg; } // namespace PHMCOREFlatBuffer -#endif namespace score { @@ -65,11 +61,7 @@ class MachineConfigFactory /// False, if an invalid machine configuration was provided. /// @note FlatCfg constructor does not define any exception guarantee and may throw a non specified exception /// @throws std::bad_alloc in case of insufficient memory -#ifdef USE_NEW_CONFIGURATION - bool init(const score::mw::launch_manager::configuration::Config& config) noexcept(false); -#else bool init() noexcept(false); -#endif /// @brief Returns the configured hm daemon cycle time in nanoseconds /// @return Configured cycle time or default cycle time if not configured @@ -80,7 +72,6 @@ class MachineConfigFactory const SupervisionBufferConfig& getSupervisionBufferConfig() const noexcept(true); private: -#ifndef USE_NEW_CONFIGURATION /// @brief Loads the hm machine config /// @param [in] f_cfg_r The flatcfg api /// @throws std::bad_alloc for string allocation in case of insufficient memory @@ -90,7 +81,6 @@ class MachineConfigFactory /// @brief Load HM settings from the machine config. I.e. buffer sizes, periodicity, etc. /// @param [in] f_flatBuffer_r The flatcfg buffer void loadHmSettings(const HMCOREFlatBuffer::HMCOREEcuCfg& f_flatBuffer_r) noexcept(true); -#endif /// @brief Log all configuration settings void logConfiguration() noexcept(true); @@ -101,11 +91,9 @@ class MachineConfigFactory /// @brief Configured supervision buffer sizes SupervisionBufferConfig supBufferCfg{}; -#ifndef USE_NEW_CONFIGURATION /// Pointer to HM Flat Buffer for given Software Cluster /// Raw pointer is used here because the memory is deallocated by FlatBuffer. const HMCOREFlatBuffer::HMCOREEcuCfg* flatBuffer_p; -#endif }; } // namespace factory diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory_new.cpp b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory_new.cpp deleted file mode 100644 index 2de3bf4d3..000000000 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/MachineConfigFactory_new.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2025 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ -#include "score/launch_manager/src/daemon/src/common/log.hpp" -#include "score/mw/launch_manager/alive_monitor/details/factory/MachineConfigFactory.hpp" - -#include -#include -#include "score/mw/launch_manager/alive_monitor/details/timers/TimeConversion.hpp" - - -namespace score -{ -namespace lcm -{ -namespace saf -{ -namespace factory -{ - -using Config = score::mw::launch_manager::configuration::Config; -using NanoSecondType = timers::NanoSecondType; - -namespace -{ -static constexpr const std::string_view kLogPrefix{"Factory for FlatCfg MachineConfig:"}; -} // namespace - -MachineConfigFactory::MachineConfigFactory() noexcept(true) -{ -} - -bool MachineConfigFactory::init(const Config& config) noexcept(false) -{ - const auto& alive_sup = config.aliveSupervision(); - assert(alive_sup.evaluation_cycle_ms != 0U && "evaluation_cycle_ms must not be zero"); - cycleTimeNs = timers::TimeConversion::convertMilliSecToNanoSec(static_cast(alive_sup.evaluation_cycle_ms)); - - LM_LOG_INFO() << kLogPrefix << "Loading of HM Machine Configuration succeeded."; - logConfiguration(); - return true; -} - -NanoSecondType MachineConfigFactory::getCycleTimeInNs() const noexcept(true) -{ - return cycleTimeNs; -} - -const SupervisionBufferConfig& MachineConfigFactory::getSupervisionBufferConfig() const - noexcept(true) -{ - return supBufferCfg; -} - -void MachineConfigFactory::logConfiguration() noexcept(true) -{ - LM_LOG_DEBUG() << kLogPrefix << "Alive Supervision buffer size:" << supBufferCfg.bufferSizeAliveSupervision; - LM_LOG_DEBUG() << kLogPrefix << "Monitor buffer size:" << supBufferCfg.bufferSizeMonitor; - LM_LOG_DEBUG() << kLogPrefix << "Periodicity:" << getCycleTimeInNs() << "ns"; -} - -} // namespace factory -} // namespace saf -} // namespace lcm -} // namespace score From b5eb09420ff257606a4c5e729bab9f441232d0eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Fu=C3=9Fberger?= Date: Mon, 3 Aug 2026 13:54:37 +0200 Subject: [PATCH 11/14] Minor improvements * Narrow visibility scope of bazel targets * Improve documentation --- .../daemon/src/alive_monitor/details/daemon/PhmDaemon.cpp | 5 +++++ .../src/daemon/src/alive_monitor/details/factory/BUILD | 3 +-- .../src/alive_monitor/details/factory/StaticConfig.hpp | 7 ++++++- .../launch_manager/src/daemon/src/watchdog/details/BUILD | 8 ++++---- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.cpp b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.cpp index 8827a2669..c90d093e4 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.cpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.cpp @@ -57,6 +57,11 @@ void PhmDaemon::performCyclicTriggers(void) phmHandler.performCyclicTriggers(syncTimestamp); } } + else + { + // distributeChanges may fail due to buffer overflow, + // which is checked on the sender side and results in a watchdog timeout. + } } #ifdef USE_NEW_CONFIGURATION diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD index d1655dcf0..d1ea66cee 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD @@ -32,7 +32,6 @@ cc_library( deps = [ "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:data_structures", "//score/launch_manager/src/daemon/src/alive_monitor/details/timers:timers_os_clock", - "//score/launch_manager/src/daemon/src/watchdog/details:i_device_config_factory", ], ) @@ -45,7 +44,7 @@ cc_library( hdrs = ["MachineConfigFactory.hpp"], include_prefix = "score/mw/launch_manager/alive_monitor/details/factory", strip_include_prefix = "/score/launch_manager/src/daemon/src/alive_monitor/details/factory", - visibility = ["//score/launch_manager/src/daemon:__subpackages__"], + visibility = ["//score/launch_manager/src/daemon/src/alive_monitor:__subpackages__"], deps = [ ":static_config", "//score/launch_manager/src/daemon/src/alive_monitor/config", diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/StaticConfig.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/StaticConfig.hpp index 4ff393670..34a267dbc 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/StaticConfig.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/StaticConfig.hpp @@ -18,7 +18,6 @@ #include "score/mw/launch_manager/alive_monitor/details/ifappl/DataStructures.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/Timers_OsClock.hpp" -#include "score/mw/launch_manager/watchdog/IDeviceConfigFactory.hpp" namespace score { @@ -53,9 +52,15 @@ class StaticConfig /// @brief By default hm daemon shutdown is disabled static constexpr bool k_hmDaemonDefaultShutdownEnabled{false}; + +#ifndef USE_NEW_CONFIGURATION /// @brief By default, 10ms cycle time is used static constexpr timers::NanoSecondType k_hmDaemonDefaultCycleTime{10000000U}; +#else + // The new configuration will have the defaults already setup when loading the configuration +#endif + /// @brief Defaults for supervision buffer sizes static constexpr SupervisionBufferConfig kDefaultSupervisionBufferConfig{StaticConfig::k_DefaultAliveSupCheckpointBufferElements, StaticConfig::k_DefaultMonitorBufferElements}; }; diff --git a/score/launch_manager/src/daemon/src/watchdog/details/BUILD b/score/launch_manager/src/daemon/src/watchdog/details/BUILD index bdebc8c64..1cc53f875 100644 --- a/score/launch_manager/src/daemon/src/watchdog/details/BUILD +++ b/score/launch_manager/src/daemon/src/watchdog/details/BUILD @@ -17,7 +17,7 @@ cc_library( hdrs = ["IDeviceConfigFactory.hpp"], include_prefix = "score/mw/launch_manager/watchdog", strip_include_prefix = "/score/launch_manager/src/daemon/src/watchdog/details", - visibility = ["//score:__subpackages__"], + visibility = ["//score/launch_manager/src/daemon/src/watchdog/details:__subpackages__"], ) cc_library( @@ -25,7 +25,7 @@ cc_library( hdrs = ["Watchdog.hpp"], include_prefix = "score/mw/launch_manager/watchdog/details", strip_include_prefix = "/score/launch_manager/src/daemon/src/watchdog/details", - visibility = ["//score:__subpackages__"], + visibility = ["//score/launch_manager/src/daemon/src/watchdog/details:__subpackages__"], ) cc_library( @@ -34,7 +34,7 @@ cc_library( hdrs = ["DeviceIf.hpp"], include_prefix = "score/mw/launch_manager/watchdog/details", strip_include_prefix = "/score/launch_manager/src/daemon/src/watchdog/details", - visibility = ["//score:__subpackages__"], + visibility = ["//score/launch_manager/src/daemon/src/watchdog/details:__subpackages__"], deps = ["@score_baselibs//score/language/futurecpp"], ) @@ -44,7 +44,7 @@ cc_library( hdrs = ["WatchdogImpl.hpp"], include_prefix = "score/mw/launch_manager/watchdog/details", strip_include_prefix = "/score/launch_manager/src/daemon/src/watchdog/details", - visibility = ["//score:__subpackages__"], + visibility = ["//score/launch_manager/src/daemon/src/watchdog/details:__subpackages__"], deps = [ ":device_if", ":watchdog", From 9716aa33a2e05ec8eb0b5c64ae348ec5574a6b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Fu=C3=9Fberger?= Date: Mon, 3 Aug 2026 12:34:54 +0000 Subject: [PATCH 12/14] visibility changes --- score/launch_manager/src/daemon/BUILD | 1 - .../src/alive_monitor/details/daemon/BUILD | 2 +- .../details/daemon/PhmDaemon.hpp | 27 +++++++++---------- .../details/daemon/SwClusterHandler.hpp | 3 ++- .../src/alive_monitor/details/factory/BUILD | 6 +++-- .../details/factory/FlatCfgFactory.hpp | 2 +- .../src/daemon/src/watchdog/BUILD | 1 + .../src/daemon/src/watchdog/details/BUILD | 2 +- 8 files changed, 23 insertions(+), 21 deletions(-) diff --git a/score/launch_manager/src/daemon/BUILD b/score/launch_manager/src/daemon/BUILD index 272b0d089..f865b7f25 100644 --- a/score/launch_manager/src/daemon/BUILD +++ b/score/launch_manager/src/daemon/BUILD @@ -38,7 +38,6 @@ cc_binary( ] + select({ "//config:lm_use_new_configuration": [ "//score/launch_manager/src/daemon/src/configuration:flatbuffer_config_loader", - "//score/launch_manager/src/daemon/src/watchdog/details:watchdog_impl", ], "//conditions:default": [], }), diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD index a2e53b8ff..01d6ab4a7 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD @@ -32,8 +32,8 @@ cc_library( strip_include_prefix = "/score/launch_manager/src/daemon/src/alive_monitor/details/daemon", visibility = ["//score/launch_manager/src/daemon/src/alive_monitor:__subpackages__"], deps = [ + "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:static_config", "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:flat_cfg_factory", - "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:machine_config_factory", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:checkpoint", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:data_structures", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:monitor_if_daemon", diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp index 832cbdc32..d20c39bc6 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/PhmDaemon.hpp @@ -21,14 +21,15 @@ #include "score/launch_manager/src/daemon/src/common/log.hpp" #include "score/mw/launch_manager/alive_monitor/details/daemon/PhmDaemonConfig.hpp" #include "score/mw/launch_manager/alive_monitor/details/daemon/SwClusterHandler.hpp" -#include "score/mw/launch_manager/alive_monitor/details/factory/MachineConfigFactory.hpp" +#include "score/mw/launch_manager/alive_monitor/details/factory/StaticConfig.hpp" #include "score/mw/launch_manager/alive_monitor/details/ifexm/ProcessStateReader.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/CycleTimeValidator.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/CycleTimer.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/TimeConversion.hpp" -#include "score/mw/launch_manager/alive_monitor/details/factory/StaticConfig.hpp" #ifdef USE_NEW_CONFIGURATION #include "score/mw/launch_manager/configuration/config.hpp" +#else +#include "score/mw/launch_manager/alive_monitor/details/factory/MachineConfigFactory.hpp" #endif namespace score { @@ -42,8 +43,8 @@ namespace daemon /// @brief Return codes for PhmDaemon Initialization enum class EInitCode : std::int8_t { - kNoError, ///< Init Successful (no error occurred) - kNotInitialized, ///< Init was not performed + kNoError, ///< Init Successful (no error occurred) + kNotInitialized, ///< Init was not performed kCycleTimeInitFailed, ///< Cyclic Timer initialization failed kConstructFlatCfgFactoryFailed, ///< FlatCfgFactory failed loading SWCL configurations kMachineConfigInitFailed, ///< MachineConfigFactory failed loading the machine configuration @@ -51,13 +52,12 @@ enum class EInitCode : std::int8_t kGeneralError ///< General error }; - /// @brief PHM daemon main class wraps the functionality for initialization and cyclic execution. /// @details This is the main class responsible to execute the main functionalities of PHM daemon, /// by using the necessary classes from this software component. class PhmDaemon { -public: + public: using OsClock = score::lcm::saf::timers::OsClockInterface; using ProcessStateReceiver = score::lcm::IProcessStateReceiver; using RecoveryClient = score::lcm::IRecoveryClient; @@ -77,11 +77,11 @@ class PhmDaemon as same as generated function", true_no_defect) */ /// @brief Set the OS clock interface /// @param[in] f_osClock Access to the system clock (dependency injection possible in tests) - /// @param[in] f_process_state_receiver process state receiver implementation (dependency injection possible in tests) + /// @param[in] f_process_state_receiver process state receiver implementation (dependency injection possible in + /// tests) /* RULECHECKER_comment(3,1, check_expensive_to_copy_in_parameter, "Move only types cannot be passed by const ref", true_no_defect) */ - PhmDaemon(OsClock& f_osClock, - std::unique_ptr f_process_state_receiver); + PhmDaemon(OsClock& f_osClock, std::unique_ptr f_process_state_receiver); /* RULECHECKER_comment(0, 4, check_min_instructions, "Default destructor is not provided\ a function body", true_no_defect) */ @@ -111,8 +111,8 @@ class PhmDaemon return EInitCode::kConstructFlatCfgFactoryFailed; } - int64_t cycleTimeModified{ - static_cast(timers::TimeConversion::convertMilliSecToNanoSec(config.aliveSupervision().evaluation_cycle_ms))}; + int64_t cycleTimeModified{static_cast( + timers::TimeConversion::convertMilliSecToNanoSec(config.aliveSupervision().evaluation_cycle_ms))}; #else EInitCode init(std::shared_ptr recovery_client) noexcept(false) { @@ -131,8 +131,7 @@ class PhmDaemon int64_t cycleTimeModified{static_cast(machineConfig.getCycleTimeInNs())}; #endif - cycleTimeModified = - CycleTimeValidator::adjustCycleTimeOnClockAccuracy(cycleTimeModified, osClock); + cycleTimeModified = CycleTimeValidator::adjustCycleTimeOnClockAccuracy(cycleTimeModified, osClock); const int64_t timerInit{cycleTimer.init(cycleTimeModified)}; if (timerInit > 0) @@ -223,7 +222,7 @@ class PhmDaemon return true; } -private: + private: /// @brief Create SwCluster objects & Invoke construction of worker objects /// @details Create the SwclusterHandler objects and the workers for the SwclusterHandler /// @param[in] f_bufferConfig_r The buffer configuration used for worker construction diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/SwClusterHandler.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/SwClusterHandler.hpp index 542e41425..8199d6d92 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/SwClusterHandler.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/SwClusterHandler.hpp @@ -14,11 +14,12 @@ #ifndef SWCLUSTERHANDLER_HPP_INCLUDED #define SWCLUSTERHANDLER_HPP_INCLUDED -#include "score/mw/launch_manager/alive_monitor/details/factory/MachineConfigFactory.hpp" +#include "score/mw/launch_manager/alive_monitor/details/factory/StaticConfig.hpp" #include "score/mw/launch_manager/alive_monitor/details/ifappl/DataStructures.hpp" #include "score/mw/launch_manager/alive_monitor/details/ifexm/ProcessState.hpp" #include "score/mw/launch_manager/alive_monitor/details/ifexm/ProcessStateReader.hpp" #include "score/mw/launch_manager/alive_monitor/details/timers/Timers_OsClock.hpp" + #ifdef USE_NEW_CONFIGURATION #include "score/mw/launch_manager/configuration/config.hpp" #endif diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD index d1ea66cee..d63f96755 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD @@ -75,8 +75,8 @@ cc_library( visibility = ["//score/launch_manager/src/daemon/src/alive_monitor:__subpackages__"], deps = [ ":i_phm_factory", - ":machine_config_factory", "//score/launch_manager/src/daemon/src/alive_monitor/config", + "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:static_config", "//score/launch_manager/src/daemon/src/alive_monitor/details/common:types", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:checkpoint", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:monitor_if_daemon", @@ -94,7 +94,9 @@ cc_library( "//score/launch_manager/src/daemon/src/common:alive_interface_path", "//score/launch_manager/src/daemon/src/configuration:config", ], - "//conditions:default": [], + "//conditions:default": [ + ":machine_config_factory", + ], }) + select({ "@platforms//os:qnx": [], "@platforms//os:linux": ["//externals/acl"], diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory.hpp b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory.hpp index af6a3c760..7301e56b5 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory.hpp +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/FlatCfgFactory.hpp @@ -21,7 +21,7 @@ #include #include "score/mw/launch_manager/alive_monitor/details/common/Types.hpp" #include "score/mw/launch_manager/alive_monitor/details/factory/IPhmFactory.hpp" -#include "score/mw/launch_manager/alive_monitor/details/factory/MachineConfigFactory.hpp" +#include "score/mw/launch_manager/alive_monitor/details/factory/StaticConfig.hpp" #include "score/mw/launch_manager/alive_monitor/details/ifexm/ProcessStateReader.hpp" #ifdef USE_NEW_CONFIGURATION #include "score/mw/launch_manager/configuration/config.hpp" diff --git a/score/launch_manager/src/daemon/src/watchdog/BUILD b/score/launch_manager/src/daemon/src/watchdog/BUILD index 89c092eb2..fbea9b96e 100644 --- a/score/launch_manager/src/daemon/src/watchdog/BUILD +++ b/score/launch_manager/src/daemon/src/watchdog/BUILD @@ -20,5 +20,6 @@ cc_library( visibility = ["//score:__subpackages__"], deps = [ "//score/launch_manager/src/daemon/src/common:constants", + "//score/launch_manager/src/daemon/src/watchdog/details:watchdog_impl", ], ) diff --git a/score/launch_manager/src/daemon/src/watchdog/details/BUILD b/score/launch_manager/src/daemon/src/watchdog/details/BUILD index 1cc53f875..31c930cb5 100644 --- a/score/launch_manager/src/daemon/src/watchdog/details/BUILD +++ b/score/launch_manager/src/daemon/src/watchdog/details/BUILD @@ -44,7 +44,7 @@ cc_library( hdrs = ["WatchdogImpl.hpp"], include_prefix = "score/mw/launch_manager/watchdog/details", strip_include_prefix = "/score/launch_manager/src/daemon/src/watchdog/details", - visibility = ["//score/launch_manager/src/daemon/src/watchdog/details:__subpackages__"], + visibility = ["//score/launch_manager/src/daemon/src/watchdog:__subpackages__"], deps = [ ":device_if", ":watchdog", From 598293fa3ef87c263c3a4de84632f8d6264b0c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Fu=C3=9Fberger?= Date: Mon, 3 Aug 2026 12:37:32 +0000 Subject: [PATCH 13/14] Introduce Watchdog Factory --- score/launch_manager/src/daemon/BUILD | 2 +- score/launch_manager/src/daemon/src/main.cpp | 2 +- .../src/daemon/src/watchdog/BUILD | 12 +++++++ .../src/daemon/src/watchdog/IWatchdogIf.hpp | 5 --- .../daemon/src/watchdog/WatchdogFactory.cpp | 32 +++++++++++++++++ .../daemon/src/watchdog/WatchdogFactory.hpp | 36 +++++++++++++++++++ .../src/watchdog/details/WatchdogImpl.cpp | 5 --- 7 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 score/launch_manager/src/daemon/src/watchdog/WatchdogFactory.cpp create mode 100644 score/launch_manager/src/daemon/src/watchdog/WatchdogFactory.hpp diff --git a/score/launch_manager/src/daemon/BUILD b/score/launch_manager/src/daemon/BUILD index f865b7f25..70df337e0 100644 --- a/score/launch_manager/src/daemon/BUILD +++ b/score/launch_manager/src/daemon/BUILD @@ -33,7 +33,7 @@ cc_binary( "//score/launch_manager/src/daemon/src/process_group_manager:alive_monitor_thread", "//score/launch_manager/src/daemon/src/process_state_client:process_state_notifier", "//score/launch_manager/src/daemon/src/recovery_client", - "//score/launch_manager/src/daemon/src/watchdog:i_watchdog_if", + "//score/launch_manager/src/daemon/src/watchdog:watchdog_factory", "@score_baselibs//score/language/futurecpp", ] + select({ "//config:lm_use_new_configuration": [ diff --git a/score/launch_manager/src/daemon/src/main.cpp b/score/launch_manager/src/daemon/src/main.cpp index 82b9fc9f5..58471f496 100644 --- a/score/launch_manager/src/daemon/src/main.cpp +++ b/score/launch_manager/src/daemon/src/main.cpp @@ -18,7 +18,7 @@ #include "score/mw/launch_manager/common/log.hpp" #include "score/mw/launch_manager/alive_monitor/details/daemon/AliveMonitorImpl.hpp" -#include "score/mw/launch_manager/watchdog/IWatchdogIf.hpp" +#include "score/mw/launch_manager/watchdog/WatchdogFactory.hpp" #include "score/mw/launch_manager/process_group_manager/alive_monitor_thread.hpp" #include "score/mw/launch_manager/process_group_manager/process_group_manager.hpp" #include "score/mw/launch_manager/process_state_client/process_state_notifier.hpp" diff --git a/score/launch_manager/src/daemon/src/watchdog/BUILD b/score/launch_manager/src/daemon/src/watchdog/BUILD index fbea9b96e..87c930b07 100644 --- a/score/launch_manager/src/daemon/src/watchdog/BUILD +++ b/score/launch_manager/src/daemon/src/watchdog/BUILD @@ -20,6 +20,18 @@ cc_library( visibility = ["//score:__subpackages__"], deps = [ "//score/launch_manager/src/daemon/src/common:constants", + ], +) + +cc_library( + name = "watchdog_factory", + srcs = ["WatchdogFactory.cpp"], + hdrs = ["WatchdogFactory.hpp"], + include_prefix = "score/mw/launch_manager/watchdog", + strip_include_prefix = "/score/launch_manager/src/daemon/src/watchdog", + visibility = ["//score:__subpackages__"], + deps = [ + ":i_watchdog_if", "//score/launch_manager/src/daemon/src/watchdog/details:watchdog_impl", ], ) diff --git a/score/launch_manager/src/daemon/src/watchdog/IWatchdogIf.hpp b/score/launch_manager/src/daemon/src/watchdog/IWatchdogIf.hpp index e957bd39e..0513036ce 100644 --- a/score/launch_manager/src/daemon/src/watchdog/IWatchdogIf.hpp +++ b/score/launch_manager/src/daemon/src/watchdog/IWatchdogIf.hpp @@ -18,7 +18,6 @@ #include "score/mw/launch_manager/common/constants.hpp" #include -#include namespace score::mw::launch_manager::configuration { @@ -136,10 +135,6 @@ class IWatchdogIf }; }; -/// @brief Creates a concrete WatchdogImpl instance behind the IWatchdogIf interface. -/// @return An owning pointer to a new watchdog implementation. -std::unique_ptr createWatchdog(); - } // namespace watchdog } // namespace lcm } // namespace score diff --git a/score/launch_manager/src/daemon/src/watchdog/WatchdogFactory.cpp b/score/launch_manager/src/daemon/src/watchdog/WatchdogFactory.cpp new file mode 100644 index 000000000..6b3f77168 --- /dev/null +++ b/score/launch_manager/src/daemon/src/watchdog/WatchdogFactory.cpp @@ -0,0 +1,32 @@ +/******************************************************************************** + * Copyright (c) 2026 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +#include "score/mw/launch_manager/watchdog/WatchdogFactory.hpp" + +#include "score/mw/launch_manager/watchdog/details/WatchdogImpl.hpp" + +namespace score +{ +namespace lcm +{ +namespace watchdog +{ + +std::unique_ptr createWatchdog() +{ + return std::make_unique(); +} + +} // namespace watchdog +} // namespace lcm +} // namespace score diff --git a/score/launch_manager/src/daemon/src/watchdog/WatchdogFactory.hpp b/score/launch_manager/src/daemon/src/watchdog/WatchdogFactory.hpp new file mode 100644 index 000000000..67edcb57c --- /dev/null +++ b/score/launch_manager/src/daemon/src/watchdog/WatchdogFactory.hpp @@ -0,0 +1,36 @@ +/******************************************************************************** + * Copyright (c) 2026 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +#ifndef WATCHDOGFACTORY_HPP_INCLUDED +#define WATCHDOGFACTORY_HPP_INCLUDED + +#include "score/mw/launch_manager/watchdog/IWatchdogIf.hpp" + +#include + +namespace score +{ +namespace lcm +{ +namespace watchdog +{ + +/// @brief Creates a concrete WatchdogImpl instance behind the IWatchdogIf interface. +/// @return An owning pointer to a new watchdog implementation. +std::unique_ptr createWatchdog(); + +} // namespace watchdog +} // namespace lcm +} // namespace score + +#endif diff --git a/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp b/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp index 6fda093b4..4f00c5750 100644 --- a/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp +++ b/score/launch_manager/src/daemon/src/watchdog/details/WatchdogImpl.cpp @@ -484,11 +484,6 @@ void WatchdogImpl::waitForever() const noexcept #pragma CTC ENDSKIP #endif -std::unique_ptr createWatchdog() -{ - return std::make_unique(); -} - } // namespace watchdog } // namespace lcm } // namespace score From 755e6a755359fd8d4f72dd13d4dd7b4c6e155cac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Fu=C3=9Fberger?= Date: Mon, 3 Aug 2026 15:08:15 +0200 Subject: [PATCH 14/14] Fix bazel formatting --- .../src/daemon/src/alive_monitor/details/daemon/BUILD | 4 ++-- .../src/daemon/src/alive_monitor/details/factory/BUILD | 2 +- score/launch_manager/src/daemon/src/watchdog/details/BUILD | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD index 01d6ab4a7..597392286 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/daemon/BUILD @@ -32,8 +32,8 @@ cc_library( strip_include_prefix = "/score/launch_manager/src/daemon/src/alive_monitor/details/daemon", visibility = ["//score/launch_manager/src/daemon/src/alive_monitor:__subpackages__"], deps = [ - "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:static_config", "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:flat_cfg_factory", + "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:static_config", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:checkpoint", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:data_structures", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:monitor_if_daemon", @@ -65,8 +65,8 @@ cc_library( ":phm_daemon_config", ":sw_cluster_handler", "//score/launch_manager/src/control_client", - "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:static_config", "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:flat_cfg_factory", + "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:static_config", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:monitor_if_daemon", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifexm:process_state_reader", "//score/launch_manager/src/daemon/src/alive_monitor/details/supervision:alive", diff --git a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD index d63f96755..75b2da4d5 100644 --- a/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD +++ b/score/launch_manager/src/daemon/src/alive_monitor/details/factory/BUILD @@ -76,8 +76,8 @@ cc_library( deps = [ ":i_phm_factory", "//score/launch_manager/src/daemon/src/alive_monitor/config", - "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:static_config", "//score/launch_manager/src/daemon/src/alive_monitor/details/common:types", + "//score/launch_manager/src/daemon/src/alive_monitor/details/factory:static_config", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:checkpoint", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifappl:monitor_if_daemon", "//score/launch_manager/src/daemon/src/alive_monitor/details/ifexm:process_state", diff --git a/score/launch_manager/src/daemon/src/watchdog/details/BUILD b/score/launch_manager/src/daemon/src/watchdog/details/BUILD index 31c930cb5..56cd47419 100644 --- a/score/launch_manager/src/daemon/src/watchdog/details/BUILD +++ b/score/launch_manager/src/daemon/src/watchdog/details/BUILD @@ -51,8 +51,8 @@ cc_library( "//score/launch_manager/src/daemon/src/alive_monitor/details/timers:os_clock_interface", "//score/launch_manager/src/daemon/src/common:log", "//score/launch_manager/src/daemon/src/configuration:config", - "//score/launch_manager/src/daemon/src/watchdog/details:i_device_config_factory", "//score/launch_manager/src/daemon/src/watchdog:i_watchdog_if", + "//score/launch_manager/src/daemon/src/watchdog/details:i_device_config_factory", "@score_baselibs//score/language/futurecpp", ], )