mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-13 00:31:14 +00:00
feat(EventManager): Out of line some methods
This commit is contained in:
parent
e4f258c9ea
commit
c11506e958
|
@ -1,5 +1,5 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
# Copyright (C) 2012-2023 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH #
|
# Copyright (C) 2012-2025 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH #
|
||||||
# #
|
# #
|
||||||
# This software is distributed under the terms of the #
|
# This software is distributed under the terms of the #
|
||||||
# GNU Lesser General Public Licence (LGPL) version 3, #
|
# GNU Lesser General Public Licence (LGPL) version 3, #
|
||||||
|
@ -119,6 +119,7 @@ if(BUILD_FAIRMQ)
|
||||||
Channel.cxx
|
Channel.cxx
|
||||||
Device.cxx
|
Device.cxx
|
||||||
DeviceRunner.cxx
|
DeviceRunner.cxx
|
||||||
|
EventManager.cxx
|
||||||
JSONParser.cxx
|
JSONParser.cxx
|
||||||
MemoryResources.cxx
|
MemoryResources.cxx
|
||||||
Plugin.cxx
|
Plugin.cxx
|
||||||
|
|
20
fairmq/EventManager.cxx
Normal file
20
fairmq/EventManager.cxx
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
/********************************************************************************
|
||||||
|
* Copyright (C) 2025 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
|
||||||
|
* *
|
||||||
|
* This software is distributed under the terms of the *
|
||||||
|
* GNU Lesser General Public Licence (LGPL) version 3, *
|
||||||
|
* copied verbatim in the file "LICENSE" *
|
||||||
|
********************************************************************************/
|
||||||
|
#include "EventManager.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <typeindex>
|
||||||
|
|
||||||
|
template std::shared_ptr<
|
||||||
|
fair::mq::EventManager::Signal<fair::mq::PropertyChangeAsString, std::string>>
|
||||||
|
fair::mq::EventManager::GetSignal<fair::mq::PropertyChangeAsString, std::string>(
|
||||||
|
const std::pair<std::type_index, std::type_index>& key) const;
|
||||||
|
|
||||||
|
template void fair::mq::EventManager::Subscribe<fair::mq::PropertyChangeAsString, std::string>(
|
||||||
|
const std::string& subscriber,
|
||||||
|
std::function<void(typename fair::mq::PropertyChangeAsString::KeyType, std::string)>);
|
|
@ -1,5 +1,5 @@
|
||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
* Copyright (C) 2014-2017 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
|
* Copyright (C) 2014-2025 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
|
||||||
* *
|
* *
|
||||||
* This software is distributed under the terms of the *
|
* This software is distributed under the terms of the *
|
||||||
* GNU Lesser General Public Licence (LGPL) version 3, *
|
* GNU Lesser General Public Licence (LGPL) version 3, *
|
||||||
|
@ -57,27 +57,8 @@ class EventManager
|
||||||
template<typename E, typename ...Args>
|
template<typename E, typename ...Args>
|
||||||
using Signal = boost::signals2::signal<void(typename E::KeyType, Args...)>;
|
using Signal = boost::signals2::signal<void(typename E::KeyType, Args...)>;
|
||||||
|
|
||||||
template<typename E, typename ...Args>
|
template<typename E, typename... Args>
|
||||||
auto Subscribe(const std::string& subscriber, std::function<void(typename E::KeyType, Args...)> callback) -> void
|
auto Subscribe(const std::string& subscriber, std::function<void(typename E::KeyType, Args...)> callback) -> void;
|
||||||
{
|
|
||||||
const std::type_index event_type_index{typeid(E)};
|
|
||||||
const std::type_index callback_type_index{typeid(std::function<void(typename E::KeyType, Args...)>)};
|
|
||||||
const auto signalsKey = std::make_pair(event_type_index, callback_type_index);
|
|
||||||
const auto connectionsKey = std::make_pair(subscriber, signalsKey);
|
|
||||||
|
|
||||||
const auto connection = GetSignal<E, Args...>(signalsKey)->connect(callback);
|
|
||||||
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock{fMutex};
|
|
||||||
|
|
||||||
if (fConnections.find(connectionsKey) != fConnections.end())
|
|
||||||
{
|
|
||||||
fConnections.at(connectionsKey).disconnect();
|
|
||||||
fConnections.erase(connectionsKey);
|
|
||||||
}
|
|
||||||
fConnections.insert({connectionsKey, connection});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename E, typename ...Args>
|
template<typename E, typename ...Args>
|
||||||
auto Unsubscribe(const std::string& subscriber) -> void
|
auto Unsubscribe(const std::string& subscriber) -> void
|
||||||
|
@ -119,12 +100,17 @@ class EventManager
|
||||||
mutable std::mutex fMutex;
|
mutable std::mutex fMutex;
|
||||||
|
|
||||||
template<typename E, typename ...Args>
|
template<typename E, typename ...Args>
|
||||||
auto GetSignal(const SignalsKey& key) const -> std::shared_ptr<Signal<E, Args...>>
|
auto GetSignal(const SignalsKey& key) const -> std::shared_ptr<Signal<E, Args...>>;
|
||||||
{
|
}; /* class EventManager */
|
||||||
|
|
||||||
|
struct PropertyChangeAsString : Event<std::string> {};
|
||||||
|
|
||||||
|
template<typename E, typename... Args>
|
||||||
|
auto EventManager::GetSignal(const SignalsKey& key) const -> std::shared_ptr<Signal<E, Args...>>
|
||||||
|
{
|
||||||
std::lock_guard<std::mutex> lock{fMutex};
|
std::lock_guard<std::mutex> lock{fMutex};
|
||||||
|
|
||||||
if (fSignals.find(key) == fSignals.end())
|
if (fSignals.find(key) == fSignals.end()) {
|
||||||
{
|
|
||||||
// wrapper is needed because boost::signals2::signal is neither copyable nor movable
|
// wrapper is needed because boost::signals2::signal is neither copyable nor movable
|
||||||
// and I don't know how else to insert it into the map
|
// and I don't know how else to insert it into the map
|
||||||
auto signal = std::make_shared<Signal<E, Args...>>();
|
auto signal = std::make_shared<Signal<E, Args...>>();
|
||||||
|
@ -132,8 +118,40 @@ class EventManager
|
||||||
}
|
}
|
||||||
|
|
||||||
return boost::any_cast<std::shared_ptr<Signal<E, Args...>>>(fSignals.at(key));
|
return boost::any_cast<std::shared_ptr<Signal<E, Args...>>>(fSignals.at(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename E, typename... Args>
|
||||||
|
auto EventManager::Subscribe(const std::string& subscriber,
|
||||||
|
std::function<void(typename E::KeyType, Args...)> callback) -> void
|
||||||
|
{
|
||||||
|
const std::type_index event_type_index{typeid(E)};
|
||||||
|
const std::type_index callback_type_index{
|
||||||
|
typeid(std::function<void(typename E::KeyType, Args...)>)};
|
||||||
|
const auto signalsKey = std::make_pair(event_type_index, callback_type_index);
|
||||||
|
const auto connectionsKey = std::make_pair(subscriber, signalsKey);
|
||||||
|
|
||||||
|
const auto connection = GetSignal<E, Args...>(signalsKey)->connect(callback);
|
||||||
|
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock{fMutex};
|
||||||
|
|
||||||
|
if (fConnections.find(connectionsKey) != fConnections.end()) {
|
||||||
|
fConnections.at(connectionsKey).disconnect();
|
||||||
|
fConnections.erase(connectionsKey);
|
||||||
}
|
}
|
||||||
}; /* class EventManager */
|
fConnections.insert({connectionsKey, connection});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern template std::shared_ptr<
|
||||||
|
fair::mq::EventManager::Signal<fair::mq::PropertyChangeAsString, std::string>>
|
||||||
|
fair::mq::EventManager::GetSignal<fair::mq::PropertyChangeAsString, std::string>(
|
||||||
|
const std::pair<std::type_index, std::type_index>& key) const;
|
||||||
|
|
||||||
|
extern template void
|
||||||
|
fair::mq::EventManager::Subscribe<fair::mq::PropertyChangeAsString, std::string>(
|
||||||
|
const std::string& subscriber,
|
||||||
|
std::function<void(typename fair::mq::PropertyChangeAsString::KeyType, std::string)>);
|
||||||
|
|
||||||
} // namespace fair::mq
|
} // namespace fair::mq
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
* Copyright (C) 2014-2018 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
|
* Copyright (C) 2014-2025 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
|
||||||
* *
|
* *
|
||||||
* This software is distributed under the terms of the *
|
* This software is distributed under the terms of the *
|
||||||
* GNU Lesser General Public Licence (LGPL) version 3, *
|
* GNU Lesser General Public Licence (LGPL) version 3, *
|
||||||
|
@ -29,7 +29,6 @@ using Property = boost::any;
|
||||||
using Properties = std::map<std::string, Property>;
|
using Properties = std::map<std::string, Property>;
|
||||||
|
|
||||||
struct PropertyChange : Event<std::string> {};
|
struct PropertyChange : Event<std::string> {};
|
||||||
struct PropertyChangeAsString : Event<std::string> {};
|
|
||||||
|
|
||||||
class PropertyHelper
|
class PropertyHelper
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user