15 #ifndef STATUS_MONITOR__STATUS_MONITOR_HPP_
16 #define STATUS_MONITOR__STATUS_MONITOR_HPP_
24 #include <unordered_map>
35 std::chrono::high_resolution_clock::time_point last_access;
37 using duration = std::chrono::high_resolution_clock::duration;
39 duration minimum_access_interval;
41 duration maximum_access_interval;
45 template <
typename Name>
46 explicit Status(Name && name)
47 : name(std::forward<decltype(name)>(name)),
48 last_access(std::chrono::high_resolution_clock::now()),
49 minimum_access_interval(duration::max()),
50 maximum_access_interval(duration::min())
54 auto since_last_access()
const
56 return std::chrono::high_resolution_clock::now() - last_access;
59 auto good()
const {
return exited or since_last_access() < threshold; }
61 explicit operator bool()
const {
return good(); }
64 static inline std::ofstream file;
66 static inline std::unordered_map<std::thread::id, Status> statuses;
68 static inline std::thread watchdog;
70 static inline std::atomic_bool terminating;
72 static inline std::chrono::seconds threshold = std::chrono::seconds(10);
74 static inline std::mutex mutex;
81 template <
typename Name>
84 auto lock = std::scoped_lock<std::mutex>(mutex);
86 if (
auto iter = statuses.find(std::this_thread::get_id()); iter != std::end(statuses)) {
87 [[maybe_unused]]
auto && [id, status] = *iter;
89 const auto now = std::chrono::high_resolution_clock::now();
91 const auto this_access_interval = now - status.last_access;
93 status.minimum_access_interval =
94 std::min(status.minimum_access_interval, this_access_interval);
96 status.maximum_access_interval =
97 std::max(status.maximum_access_interval, this_access_interval);
99 status.last_access = now;
101 statuses.emplace(std::this_thread::get_id(), std::forward<decltype(name)>(name));
105 template <
typename T>
108 std::reference_wrapper<T> target;
113 template <
typename... Ts>
116 auto lock = std::scoped_lock<std::mutex>(mutex);
117 return std::exchange(std::forward<decltype(
xs)>(
xs)...);
120 template <
typename U>
136 template <
typename Thunk>
145 auto write() const ->
void;
Definition: status_monitor.hpp:107
ScopedExchanger(T &x, U &&y)
Definition: status_monitor.hpp:121
static auto locked_exchange(Ts &&... xs) -> decltype(auto)
Definition: status_monitor.hpp:114
~ScopedExchanger()
Definition: status_monitor.hpp:126
Definition: status_monitor.hpp:30
auto write() const -> void
Definition: status_monitor.cpp:81
~StatusMonitor()
Definition: status_monitor.cpp:60
auto overrideThreshold(const std::chrono::seconds &t, Thunk thunk) -> decltype(auto)
Definition: status_monitor.hpp:137
auto touch(Name &&name)
Definition: status_monitor.hpp:82
StatusMonitor()
Definition: status_monitor.cpp:39
Definition: concatenate.hpp:24
class common::StatusMonitor status_monitor
Definition: lanelet_wrapper.hpp:40
Definition: junit5.hpp:25
std::string string
Definition: junit5.hpp:26
Definition: status_monitor.hpp:130
~ScopedUpdater()
Definition: status_monitor.hpp:133
StatusMonitor & monitor
Definition: status_monitor.hpp:131
ScopedUpdater(StatusMonitor &m)
Definition: status_monitor.hpp:132
TrafficLight::Status Status
Definition: test_traffic_light.cpp:26