mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-13 08:41:16 +00:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
dcea48fcee | ||
|
67dcf77a7f | ||
|
24e7a5b8d0 | ||
|
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 #
|
||||
# GNU Lesser General Public Licence (LGPL) version 3, #
|
||||
|
@ -69,9 +69,15 @@ if(BUILD_FAIRMQ)
|
|||
runDevice.h
|
||||
runFairMQDevice.h
|
||||
shmem/Common.h
|
||||
shmem/Manager.h
|
||||
shmem/Message.h
|
||||
shmem/Monitor.h
|
||||
shmem/Poller.h
|
||||
shmem/Segment.h
|
||||
shmem/Socket.h
|
||||
shmem/TransportFactory.h
|
||||
shmem/UnmanagedRegion.h
|
||||
shmem/UnmanagedRegionImpl.h
|
||||
tools/Compiler.h
|
||||
tools/CppSTL.h
|
||||
tools/Exceptions.h
|
||||
|
@ -96,12 +102,6 @@ if(BUILD_FAIRMQ)
|
|||
plugins/Builtin.h
|
||||
plugins/config/Config.h
|
||||
plugins/control/Control.h
|
||||
shmem/Message.h
|
||||
shmem/Poller.h
|
||||
shmem/UnmanagedRegionImpl.h
|
||||
shmem/Socket.h
|
||||
shmem/TransportFactory.h
|
||||
shmem/Manager.h
|
||||
zeromq/Common.h
|
||||
zeromq/Context.h
|
||||
zeromq/Message.h
|
||||
|
@ -119,6 +119,7 @@ if(BUILD_FAIRMQ)
|
|||
Channel.cxx
|
||||
Device.cxx
|
||||
DeviceRunner.cxx
|
||||
EventManager.cxx
|
||||
JSONParser.cxx
|
||||
MemoryResources.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 *
|
||||
* GNU Lesser General Public Licence (LGPL) version 3, *
|
||||
|
@ -57,27 +57,8 @@ class EventManager
|
|||
template<typename E, typename ...Args>
|
||||
using Signal = boost::signals2::signal<void(typename E::KeyType, Args...)>;
|
||||
|
||||
template<typename E, typename ...Args>
|
||||
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>
|
||||
auto Subscribe(const std::string& subscriber, std::function<void(typename E::KeyType, Args...)> callback) -> void;
|
||||
|
||||
template<typename E, typename ...Args>
|
||||
auto Unsubscribe(const std::string& subscriber) -> void
|
||||
|
@ -119,21 +100,58 @@ class EventManager
|
|||
mutable std::mutex fMutex;
|
||||
|
||||
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};
|
||||
|
||||
if (fSignals.find(key) == fSignals.end()) {
|
||||
// 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
|
||||
auto signal = std::make_shared<Signal<E, Args...>>();
|
||||
fSignals.insert(std::make_pair(key, signal));
|
||||
}
|
||||
|
||||
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 (fSignals.find(key) == fSignals.end())
|
||||
{
|
||||
// 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
|
||||
auto signal = std::make_shared<Signal<E, Args...>>();
|
||||
fSignals.insert(std::make_pair(key, signal));
|
||||
if (fConnections.find(connectionsKey) != fConnections.end()) {
|
||||
fConnections.at(connectionsKey).disconnect();
|
||||
fConnections.erase(connectionsKey);
|
||||
}
|
||||
|
||||
return boost::any_cast<std::shared_ptr<Signal<E, Args...>>>(fSignals.at(key));
|
||||
fConnections.insert({connectionsKey, connection});
|
||||
}
|
||||
}; /* class EventManager */
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
#include <boost/container/container_fwd.hpp>
|
||||
#include <boost/container/flat_map.hpp>
|
||||
#include <boost/container/pmr/memory_resource.hpp>
|
||||
#include <memory_resource>
|
||||
#include <cstring>
|
||||
#include <fairmq/Message.h>
|
||||
#include <stdexcept>
|
||||
|
@ -27,7 +27,7 @@ namespace fair::mq {
|
|||
|
||||
class TransportFactory;
|
||||
using byte = unsigned char;
|
||||
namespace pmr = boost::container::pmr;
|
||||
namespace pmr = std::pmr;
|
||||
|
||||
/// All FairMQ related memory resources need to inherit from this interface
|
||||
/// class for the
|
||||
|
|
|
@ -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 *
|
||||
* GNU Lesser General Public Licence (LGPL) version 3, *
|
||||
|
@ -29,7 +29,6 @@ using Property = boost::any;
|
|||
using Properties = std::map<std::string, Property>;
|
||||
|
||||
struct PropertyChange : Event<std::string> {};
|
||||
struct PropertyChangeAsString : Event<std::string> {};
|
||||
|
||||
class PropertyHelper
|
||||
{
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <gtest/gtest.h>
|
||||
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace
|
||||
|
@ -101,7 +102,7 @@ TEST(MemoryResources, allocator)
|
|||
|
||||
size_t session{tools::UuidHash()};
|
||||
ProgOptions config;
|
||||
config.SetProperty<string>("session", to_string(session));
|
||||
config.SetProperty<std::string>("session", to_string(session));
|
||||
|
||||
FactoryType factoryZMQ = TransportFactory::CreateTransportFactory("zeromq", fair::mq::tools::Uuid(), &config);
|
||||
|
||||
|
@ -129,7 +130,7 @@ TEST(MemoryResources, getMessage)
|
|||
|
||||
size_t session{tools::UuidHash()};
|
||||
ProgOptions config;
|
||||
config.SetProperty<string>("session", to_string(session));
|
||||
config.SetProperty<std::string>("session", to_string(session));
|
||||
config.SetProperty<bool>("shm-monitor", true);
|
||||
|
||||
FactoryType factoryZMQ = TransportFactory::CreateTransportFactory("zeromq", fair::mq::tools::Uuid(), &config);
|
||||
|
|
Loading…
Reference in New Issue
Block a user