Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions config/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,17 @@ config_setting(
},
visibility = ["//visibility:public"],
)

bool_flag(
name = "use_new_configuration",
build_setting_default = False,
visibility = ["//visibility:public"],
)

config_setting(
name = "lm_use_new_configuration",
flag_values = {
":use_new_configuration": "True",
},
visibility = ["//visibility:public"],
)
9 changes: 8 additions & 1 deletion examples/demo_verification/test_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,16 @@ def test_examples(target, setup_test, remote_test_dir):
"""
lm_path = str(remote_test_dir / "launch_manager")
lmcontrol_path = str(remote_test_dir / "lmcontrol")
new_config_path = str(remote_test_dir / "etc/lifecycle_demo_test.bin")

_step("Starting launch manager (Startup)")
lm_proc = target.execute_async(lm_path, cwd=str(remote_test_dir))

# launch manger will simply ignore the arguments if run with --//config:use_new_configuration=False.
# the old configuration will be used, which is the default behavior.
# The new configuration will be used if run with --//config:use_new_configuration=True
lm_proc = target.execute_async(
lm_path, cwd=str(remote_test_dir), args=["-c", new_config_path]
)

time.sleep(1.0)
assert lm_proc.is_running(), "Launch manager exited unexpectedly during Startup"
Expand Down
11 changes: 10 additions & 1 deletion score/launch_manager/src/daemon/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ load("@rules_cc//cc:defs.bzl", "cc_binary")
cc_binary(
name = "launch_manager",
srcs = ["src/main.cpp"],
defines = select({
"//config:lm_use_new_configuration": ["USE_NEW_CONFIGURATION"],
"//conditions:default": [],
}),
linkopts = select({
"@platforms//os:qnx": ["-lsecpol"],
"@platforms//os:linux": ["-lpthread"],
Expand All @@ -28,5 +32,10 @@ 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",
],
] + select({
"//config:lm_use_new_configuration": [
"//score/launch_manager/src/daemon/src/configuration:flatbuffer_config_loader",
],
"//conditions:default": [],
}),
)
Original file line number Diff line number Diff line change
Expand Up @@ -30,28 +30,46 @@ namespace saf
namespace daemon
{

AliveMonitorImpl::AliveMonitorImpl(std::shared_ptr<score::lcm::IRecoveryClient> recovery_client,
std::unique_ptr<watchdog::IWatchdogIf> watchdog,
std::unique_ptr<score::lcm::IProcessStateReceiver> process_state_receiver)
#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_logger{score::lcm::saf::logging::PhmLogger::getLogger(score::lcm::saf::logging::PhmLogger::EContext::factory)},
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_logger{score::lcm::saf::logging::PhmLogger::getLogger(score::lcm::saf::logging::PhmLogger::EContext::factory)},
m_process_state_receiver{std::move(process_state_receiver)}
{
}
#endif

EInitCode AliveMonitorImpl::init() noexcept
{
score::lcm::saf::daemon::EInitCode initResult{score::lcm::saf::daemon::EInitCode::kGeneralError};
EInitCode initResult{EInitCode::kGeneralError};
try
{
m_osClock.startMeasurement();

m_daemon = std::make_unique<score::lcm::saf::daemon::PhmDaemon>(
m_osClock, m_logger, std::move(m_watchdog), std::move(m_process_state_receiver));
m_daemon = std::make_unique<PhmDaemon>(m_osClock, m_logger, std::move(m_watchdog),
std::move(m_process_state_receiver));
#ifdef USE_NEW_CONFIGURATION
initResult = m_daemon->init(m_recovery_client, m_config);
#else
initResult = m_daemon->init(m_recovery_client);
#endif

if (initResult == score::lcm::saf::daemon::EInitCode::kNoError)
if (initResult == EInitCode::kNoError)
{
const long ms{m_osClock.endMeasurement()};
m_logger.LogDebug() << "AliveMonitor: Initialization took " << ms << " ms";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
#include <atomic>

#include "score/mw/launch_manager/alive_monitor/details/daemon/IAliveMonitor.hpp"
#ifdef USE_NEW_CONFIGURATION
#include "score/mw/launch_manager/configuration/config.hpp"
#endif

namespace score {
namespace lcm {
Expand All @@ -31,21 +34,43 @@ class IWatchdogIf;

namespace daemon {

using SptrIRecoveryClient = std::shared_ptr<score::lcm::IRecoveryClient>;
using UptrIWatchdogIf = std::unique_ptr<watchdog::IWatchdogIf>;
using UptrIProcessStateReceiver = std::unique_ptr<score::lcm::IProcessStateReceiver>;
using Logger = score::lcm::saf::logging::PhmLogger;
using UptrPhmDaemon = std::unique_ptr<score::lcm::saf::daemon::PhmDaemon>;
using OsClock = score::lcm::saf::timers::OsClockInterface;
#ifdef USE_NEW_CONFIGURATION
using Config = score::mw::launch_manager::configuration::Config;
#endif

class AliveMonitorImpl : public IAliveMonitor {
public:
AliveMonitorImpl(std::shared_ptr<score::lcm::IRecoveryClient> recovery_client, std::unique_ptr<watchdog::IWatchdogIf> watchdog, std::unique_ptr<score::lcm::IProcessStateReceiver> process_state_receiver);
#ifdef USE_NEW_CONFIGURATION
AliveMonitorImpl(SptrIRecoveryClient recovery_client,
UptrIWatchdogIf watchdog,
UptrIProcessStateReceiver process_state_receiver,
const Config& config);
#else
AliveMonitorImpl(SptrIRecoveryClient recovery_client,
UptrIWatchdogIf watchdog,
UptrIProcessStateReceiver process_state_receiver);
#endif

EInitCode init() noexcept override;

bool run(std::atomic_bool& cancel_thread) noexcept override;

private:
std::shared_ptr<score::lcm::IRecoveryClient> m_recovery_client{nullptr};
std::unique_ptr<score::lcm::saf::watchdog::IWatchdogIf> m_watchdog{nullptr};
score::lcm::saf::logging::PhmLogger& m_logger;
std::unique_ptr<score::lcm::saf::daemon::PhmDaemon> m_daemon{nullptr};
score::lcm::saf::timers::OsClockInterface m_osClock{};
std::unique_ptr<score::lcm::IProcessStateReceiver> m_process_state_receiver;
SptrIRecoveryClient m_recovery_client{nullptr};
UptrIWatchdogIf m_watchdog{nullptr};
Logger& m_logger;
UptrPhmDaemon m_daemon{nullptr};
OsClock m_osClock{};
UptrIProcessStateReceiver m_process_state_receiver;
#ifdef USE_NEW_CONFIGURATION
const Config& m_config;
#endif
};

} // namespace daemon
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ cc_library(
name = "sw_cluster_handler",
srcs = ["SwClusterHandler.cpp"],
hdrs = ["SwClusterHandler.hpp"],
defines = select({
"//config:lm_use_new_configuration": ["USE_NEW_CONFIGURATION"],
"//conditions:default": [],
}),
include_prefix = "score/mw/launch_manager/alive_monitor/details/daemon",
strip_include_prefix = "/score/launch_manager/src/daemon/src/alive_monitor/details/daemon",
visibility = ["//score/launch_manager/src/daemon/src/alive_monitor:__subpackages__"],
Expand All @@ -38,13 +42,22 @@ cc_library(
"//score/launch_manager/src/daemon/src/alive_monitor/details/logging:phm_logging",
"//score/launch_manager/src/daemon/src/alive_monitor/details/supervision:alive",
"//score/launch_manager/src/daemon/src/alive_monitor/details/timers:timers_os_clock",
],
] + select({
"//config:lm_use_new_configuration": [
"//score/launch_manager/src/daemon/src/configuration:config",
],
"//conditions:default": [],
}),
)

cc_library(
name = "phm_daemon",
srcs = ["PhmDaemon.cpp"],
hdrs = ["PhmDaemon.hpp"],
defines = select({
"//config:lm_use_new_configuration": ["USE_NEW_CONFIGURATION"],
"//conditions:default": [],
}),
include_prefix = "score/mw/launch_manager/alive_monitor/details/daemon",
strip_include_prefix = "/score/launch_manager/src/daemon/src/alive_monitor/details/daemon",
visibility = ["//score/launch_manager/src/daemon/src/alive_monitor:__subpackages__"],
Expand All @@ -63,7 +76,12 @@ cc_library(
"//score/launch_manager/src/daemon/src/alive_monitor/details/timers:timers_os_clock",
"//score/launch_manager/src/daemon/src/alive_monitor/details/watchdog:i_watchdog_if",
"//score/launch_manager/src/lifecycle_client",
],
] + select({
"//config:lm_use_new_configuration": [
"//score/launch_manager/src/daemon/src/configuration:config",
],
"//conditions:default": [],
}),
)

cc_library(
Expand All @@ -79,6 +97,10 @@ cc_library(
name = "health_monitor_impl",
srcs = ["AliveMonitorImpl.cpp"],
hdrs = ["AliveMonitorImpl.hpp"],
defines = select({
"//config:lm_use_new_configuration": ["USE_NEW_CONFIGURATION"],
"//conditions:default": [],
}),
include_prefix = "score/mw/launch_manager/alive_monitor/details/daemon",
strip_include_prefix = "/score/launch_manager/src/daemon/src/alive_monitor/details/daemon",
visibility = ["//score/launch_manager/src/daemon:__subpackages__"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@ 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(score::lcm::saf::timers::OsClockInterface& f_osClock,
logging::PhmLogger& f_logger_r,
std::unique_ptr<watchdog::IWatchdogIf> f_watchdog,
std::unique_ptr<score::lcm::IProcessStateReceiver> f_process_state_receiver)
PhmDaemon::PhmDaemon(OsClock& f_osClock,
Logger& f_logger_r,
std::unique_ptr<Watchdog> f_watchdog,
std::unique_ptr<ProcessStateReceiver> f_process_state_receiver)
: osClock{f_osClock},
cycleTimer{&osClock},
logger_r{f_logger_r},
Expand All @@ -49,7 +49,7 @@ void PhmDaemon::performCyclicTriggers(void)
{
bool isCriticalFailure{false};

timers::NanoSecondType syncTimestamp{timers::OsClock::getMonotonicSystemClock()};
NanoSecondType syncTimestamp{timers::OsClock::getMonotonicSystemClock()};
if (syncTimestamp == 0U)
{
// No valid time value, use max value for synchronization
Expand Down Expand Up @@ -82,8 +82,11 @@ void PhmDaemon::performCyclicTriggers(void)
}
}

bool PhmDaemon::construct(const factory::MachineConfigFactory::SupervisionBufferConfig& f_bufferConfig_r) noexcept(
false)
#ifdef USE_NEW_CONFIGURATION
bool PhmDaemon::construct(const Config& config, const SupervisionBufferConfig& f_bufferConfig_r) noexcept(false)
#else
bool PhmDaemon::construct(const SupervisionBufferConfig& f_bufferConfig_r) noexcept(false)
#endif
{
bool isSuccess{true};

Expand All @@ -108,7 +111,11 @@ bool PhmDaemon::construct(const factory::MachineConfigFactory::SupervisionBuffer
for (auto strSwClusterName : listSwClustersPhm.value())
{
swClusterHandlers.emplace_back(strSwClusterName);
#ifdef USE_NEW_CONFIGURATION
isSuccess = swClusterHandlers.back().constructWorkers(config, recoveryClient, processStateReader, f_bufferConfig_r);
#else
isSuccess = swClusterHandlers.back().constructWorkers(recoveryClient, processStateReader, f_bufferConfig_r);
#endif
if (!isSuccess)
{
logger_r.LogError() << "Phm Daemon: failed to create worker objects for swclusterhandler:"
Expand Down
Loading
Loading