20template <std::
size_t MaxServices = 16>
37 bool registerService(uint32_t serviceId, uint64_t timeoutNs, uint64_t initialTimestampNs = 0) noexcept
39 for (std::size_t i = 0; i < MaxServices; ++i) {
40 bool expected =
false;
41 if (_services[i].active.compare_exchange_strong(expected,
true, std::memory_order_relaxed)) {
42 _services[i].serviceId = serviceId;
43 _services[i].timeoutNs = timeoutNs;
44 _services[i].lastHeartbeatNs.store(initialTimestampNs, std::memory_order_release);
47 if (_services[i].serviceId == serviceId && expected) {
49 _services[i].timeoutNs = timeoutNs;
50 _services[i].lastHeartbeatNs.store(initialTimestampNs, std::memory_order_release);
60 void beat(uint32_t serviceId, uint64_t nowNs)
noexcept
62 for (std::size_t i = 0; i < MaxServices; ++i) {
63 if (_services[i].active.load(std::memory_order_relaxed) && _services[i].serviceId == serviceId) {
64 _services[i].lastHeartbeatNs.store(nowNs, std::memory_order_release);
73 for (std::size_t i = 0; i < MaxServices; ++i) {
74 if (_services[i].serviceId == serviceId) {
75 _services[i].active.store(
false, std::memory_order_release);
89 uint32_t& outTimedOutServiceId,
90 uint64_t& outLastHeartbeatNs,
91 uint64_t& outTimeoutBudgetNs
94 for (std::size_t i = 0; i < MaxServices; ++i) {
95 if (_services[i].active.load(std::memory_order_acquire)) {
96 const uint64_t last = _services[i].lastHeartbeatNs.load(std::memory_order_acquire);
97 const uint64_t limit = _services[i].timeoutNs;
98 if (nowNs > last && (nowNs - last) > limit) {
99 outTimedOutServiceId = _services[i].serviceId;
100 outLastHeartbeatNs = last;
101 outTimeoutBudgetNs = limit;
116 std::array<ServiceEntry, MaxServices> _services{};
Zero-heap multi-service heartbeat tracker for safety-critical execution. Thread-safe for concurrent h...
Definition HeartbeatMonitor.hpp:21
HeartbeatMonitor()=default
bool checkHealth(uint64_t nowNs, uint32_t &outTimedOutServiceId, uint64_t &outLastHeartbeatNs, uint64_t &outTimeoutBudgetNs) const noexcept
Check health status of all registered active services.
Definition HeartbeatMonitor.hpp:87
constexpr std::size_t maxServices() const noexcept
Get maximum capacity of monitored services.
Definition HeartbeatMonitor.hpp:110
bool registerService(uint32_t serviceId, uint64_t timeoutNs, uint64_t initialTimestampNs=0) noexcept
Register a service for heartbeat monitoring with a specified timeout.
Definition HeartbeatMonitor.hpp:37
void unregisterService(uint32_t serviceId) noexcept
Unregister a service from active monitoring.
Definition HeartbeatMonitor.hpp:71
void beat(uint32_t serviceId, uint64_t nowNs) noexcept
Record a heartbeat for a given service.
Definition HeartbeatMonitor.hpp:60
Definition CircuitBreaker.hpp:13
Definition HeartbeatMonitor.hpp:23
uint32_t serviceId
Definition HeartbeatMonitor.hpp:24
std::atomic< uint64_t > lastHeartbeatNs
Definition HeartbeatMonitor.hpp:26
uint64_t timeoutNs
Definition HeartbeatMonitor.hpp:25
std::atomic< bool > active
Definition HeartbeatMonitor.hpp:27