11 #include "threads/CriticalSection.h" 20 using RegistrationIdentifierType = int;
28 virtual void Unregister(RegistrationIdentifierType
id) = 0;
33 std::weak_ptr<ISignalHandlerData> m_list;
34 RegistrationIdentifierType m_registration;
36 template<
typename ManagedT>
39 CSignalRegistration(std::shared_ptr<ISignalHandlerData>
const& list, RegistrationIdentifierType registration)
40 : m_list{list}, m_registration{registration}
52 *
this = std::move(other);
58 std::swap(m_list, other.m_list);
59 m_registration = other.m_registration;
68 inline void Unregister()
70 if (
auto list = m_list.lock())
72 list->Unregister(m_registration);
78 template<
typename ManagedT>
89 CCriticalSection m_handlerCriticalSection;
90 std::map<RegistrationIdentifierType, ManagedT> m_handlers;
92 void Unregister(RegistrationIdentifierType
id)
override 94 std::unique_lock<CCriticalSection> lock(m_handlerCriticalSection);
99 std::shared_ptr<Data> m_data;
100 RegistrationIdentifierType m_lastRegistrationId{};
112 std::unique_lock<CCriticalSection> lock(m_data->m_handlerCriticalSection);
113 bool inserted{
false};
116 inserted = m_data->m_handlers.emplace(++m_lastRegistrationId, handler).second;
118 return {m_data, m_lastRegistrationId};
126 template<
typename... ArgsT>
129 std::unique_lock<CCriticalSection> lock(m_data->m_handlerCriticalSection);
130 for (
auto const& handler : *
this)
132 handler.second(std::forward<ArgsT>(args)...);
136 auto begin()
const {
return m_data->m_handlers.cbegin(); }
138 auto end()
const {
return m_data->m_handlers.cend(); }
147 return m_data->m_handlerCriticalSection;
void Invoke(ArgsT &&... args)
Invoke all registered signal handlers with the provided arguments when the signal type is a std::func...
Definition: Signals.h:127
CCriticalSection const & CriticalSection() const
Get critical section for accessing the handler list.
Definition: Signals.h:145
Definition: AudioDecoder.h:18