diff --git a/cpp_utils/include/cpp_utils/event/impl/SignalManager.ipp b/cpp_utils/include/cpp_utils/event/impl/SignalManager.ipp index 224e6442..d505fe6c 100644 --- a/cpp_utils/include/cpp_utils/event/impl/SignalManager.ipp +++ b/cpp_utils/include/cpp_utils/event/impl/SignalManager.ipp @@ -20,6 +20,7 @@ #pragma once #include +#include #include #include @@ -29,16 +30,16 @@ namespace eprosima { namespace utils { namespace event { -template +template std::recursive_mutex SignalManager::instance_mutex_; -template +template std::condition_variable SignalManager::signal_received_cv_; -template +template std::atomic SignalManager::signals_received_(0); -template +template SignalManager& SignalManager::get_instance() noexcept { std::lock_guard lock(instance_mutex_); @@ -47,7 +48,7 @@ SignalManager& SignalManager::get_instance() noexcept return instance_; } -template +template SignalManager::SignalManager() noexcept : signal_handler_thread_stop_(false) , current_last_id_(0) @@ -61,7 +62,7 @@ SignalManager::SignalManager() noexcept &SignalManager::signal_handler_thread_routine_, this); } -template +template SignalManager::~SignalManager() noexcept { { @@ -76,7 +77,7 @@ SignalManager::~SignalManager() noexcept "Destroying SignalManager in signal: " << SigVal << "."); } -template +template UniqueCallbackId SignalManager::register_callback( std::function callback) noexcept { @@ -91,7 +92,7 @@ UniqueCallbackId SignalManager::register_callback( return new_id; } -template +template void SignalManager::unregister_callback( UniqueCallbackId id) { @@ -106,7 +107,7 @@ void SignalManager::unregister_callback( "Erase callback from signal " << SigVal << "."); } -template +template UniqueCallbackId SignalManager::new_unique_id_() noexcept { std::lock_guard lock(last_id_mutex_); @@ -114,7 +115,7 @@ UniqueCallbackId SignalManager::new_unique_id_() noexcept return current_last_id_; } -template +template void SignalManager::signal_handler_function_( int sigval) noexcept { @@ -125,7 +126,7 @@ void SignalManager::signal_handler_function_( signal_received_(); } -template +template void SignalManager::signal_received_() noexcept { // Normally \c signals_received_ should be guarded by \c signal_received_cv_mutex_ in order to prevent @@ -136,7 +137,7 @@ void SignalManager::signal_received_() noexcept signal_received_cv_.notify_one(); } -template +template void SignalManager::signal_handler_routine_() noexcept { std::lock_guard lock(active_callbacks_mutex_); @@ -150,18 +151,23 @@ void SignalManager::signal_handler_routine_() noexcept } } -template +template void SignalManager::signal_handler_thread_routine_() noexcept { + // Maximum time this thread blocks in signal_received_cv_ before re-checking signals_received_ , + // and thus maximum time a signal may take to be handled when its notification is missed. + constexpr std::chrono::milliseconds MAXIMUM_WAIT_TIME(100); + while (!signal_handler_thread_stop_.load()) { std::unique_lock lock(signal_received_cv_mutex_); - signal_received_cv_.wait( + signal_received_cv_.wait_for( lock, + MAXIMUM_WAIT_TIME, [this] { return signals_received_.load() > 0 || - signal_handler_thread_stop_.load(); + signal_handler_thread_stop_.load(); }); if (signal_handler_thread_stop_.load())