mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-15 09:31:45 +00:00
feat(ofi): Require asiofi 0.5
* Modernize some ofi transport code along the way * Replace Boost.Container with `<memory_resource>` * Introduce namespaced headers * `<fairmq/Channel.h>` * `<fairmq/Message.h>` * `<fairmq/Poller.h>` * `<fairmq/Socket.h>` * `<fairmq/TransportFactory.h>` * `<fairmq/UnmanagedRegion.h>` * Compile-firewall Boost.Process in `shmem::Manager` because it conflicts with standalone asio
This commit is contained in:
committed by
Dennis Klein
parent
9585c20b7f
commit
1007de8e49
@@ -1,5 +1,5 @@
|
||||
/********************************************************************************
|
||||
* Copyright (C) 2018 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
|
||||
* Copyright (C) 2018-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
|
||||
* *
|
||||
* This software is distributed under the terms of the *
|
||||
* GNU Lesser General Public Licence (LGPL) version 3, *
|
||||
@@ -9,14 +9,28 @@
|
||||
#ifndef FAIR_MQ_OFI_TRANSPORTFACTORY_H
|
||||
#define FAIR_MQ_OFI_TRANSPORTFACTORY_H
|
||||
|
||||
#include <FairMQTransportFactory.h>
|
||||
#include <fairmq/ProgOptions.h>
|
||||
#include <fairmq/ofi/Context.h>
|
||||
|
||||
#include <asiofi.hpp>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <fairlogger/Logger.h>
|
||||
#include <fairmq/Channel.h>
|
||||
#include <fairmq/Message.h>
|
||||
#include <fairmq/Poller.h>
|
||||
#include <fairmq/ProgOptions.h>
|
||||
#include <fairmq/Socket.h>
|
||||
#include <fairmq/TransportFactory.h>
|
||||
#include <fairmq/Transports.h>
|
||||
#include <fairmq/ofi/Context.h>
|
||||
#include <fairmq/ofi/Message.h>
|
||||
#include <fairmq/ofi/Socket.h>
|
||||
#include <fairmq/ofi/TransportFactory.h>
|
||||
#include <memory>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
namespace fair::mq::ofi
|
||||
{
|
||||
namespace fair::mq::ofi {
|
||||
|
||||
/**
|
||||
* @class TransportFactory TransportFactory.h <fairmq/ofi/TransportFactory.h>
|
||||
@@ -24,37 +38,155 @@ namespace fair::mq::ofi
|
||||
*
|
||||
* @todo TODO insert long description
|
||||
*/
|
||||
class TransportFactory final : public FairMQTransportFactory
|
||||
struct TransportFactory final : mq::TransportFactory
|
||||
{
|
||||
public:
|
||||
TransportFactory(const std::string& id = "", const fair::mq::ProgOptions* config = nullptr);
|
||||
TransportFactory(const TransportFactory&) = delete;
|
||||
TransportFactory operator=(const TransportFactory&) = delete;
|
||||
TransportFactory(std::string const& id = "", ProgOptions const* config = nullptr)
|
||||
: mq::TransportFactory(id)
|
||||
, fContext(*this, *this, 1)
|
||||
{
|
||||
try {
|
||||
LOG(debug) << "OFI transport: asiofi (" << fContext.GetAsiofiVersion() << ")";
|
||||
|
||||
auto CreateMessage() -> MessagePtr override;
|
||||
auto CreateMessage(Alignment alignment) -> MessagePtr override;
|
||||
auto CreateMessage(const std::size_t size) -> MessagePtr override;
|
||||
auto CreateMessage(const std::size_t size, Alignment alignment) -> MessagePtr override;
|
||||
auto CreateMessage(void* data, const std::size_t size, fairmq_free_fn* ffn, void* hint = nullptr) -> MessagePtr override;
|
||||
auto CreateMessage(UnmanagedRegionPtr& region, void* data, const std::size_t size, void* hint = nullptr) -> MessagePtr override;
|
||||
if (config) {
|
||||
fContext.SetSizeHint(config->GetProperty<size_t>("ofi-size-hint", 0));
|
||||
}
|
||||
} catch (ContextError& e) {
|
||||
throw TransportFactoryError(e.what());
|
||||
}
|
||||
}
|
||||
|
||||
auto CreateSocket(const std::string& type, const std::string& name) -> SocketPtr override;
|
||||
TransportFactory(TransportFactory const&) = delete;
|
||||
TransportFactory& operator=(TransportFactory const&) = delete;
|
||||
TransportFactory(TransportFactory&&) = default;
|
||||
TransportFactory& operator=(TransportFactory&&) = default;
|
||||
|
||||
auto CreatePoller(const std::vector<FairMQChannel>& channels) const -> PollerPtr override;
|
||||
auto CreatePoller(const std::vector<FairMQChannel*>& channels) const -> PollerPtr override;
|
||||
auto CreatePoller(const std::unordered_map<std::string, std::vector<FairMQChannel>>& channelsMap, const std::vector<std::string>& channelList) const -> PollerPtr override;
|
||||
auto CreateMessage() -> std::unique_ptr<mq::Message> override
|
||||
{
|
||||
return std::make_unique<Message>(&fMemoryResource);
|
||||
}
|
||||
|
||||
auto CreateUnmanagedRegion(const size_t size, RegionCallback callback = nullptr, const std::string& path = "", int flags = 0, fair::mq::RegionConfig cfg = fair::mq::RegionConfig()) -> UnmanagedRegionPtr override;
|
||||
auto CreateUnmanagedRegion(const size_t size, RegionBulkCallback callback = nullptr, const std::string& path = "", int flags = 0, fair::mq::RegionConfig cfg = fair::mq::RegionConfig()) -> UnmanagedRegionPtr override;
|
||||
auto CreateUnmanagedRegion(const size_t size, int64_t userFlags, RegionCallback callback = nullptr, const std::string& path = "", int flags = 0, fair::mq::RegionConfig cfg = fair::mq::RegionConfig()) -> UnmanagedRegionPtr override;
|
||||
auto CreateUnmanagedRegion(const size_t size, int64_t userFlags, RegionBulkCallback callback = nullptr, const std::string& path = "", int flags = 0, fair::mq::RegionConfig cfg = fair::mq::RegionConfig()) -> UnmanagedRegionPtr override;
|
||||
auto CreateMessage(Alignment /*alignment*/) -> std::unique_ptr<mq::Message> override
|
||||
{
|
||||
// TODO Do not ignore alignment
|
||||
return std::make_unique<Message>(&fMemoryResource);
|
||||
}
|
||||
|
||||
void SubscribeToRegionEvents(RegionEventCallback /* callback */) override { LOG(error) << "SubscribeToRegionEvents not yet implemented for OFI"; }
|
||||
bool SubscribedToRegionEvents() override { LOG(error) << "Region event subscriptions not yet implemented for OFI"; return false; }
|
||||
void UnsubscribeFromRegionEvents() override { LOG(error) << "UnsubscribeFromRegionEvents not yet implemented for OFI"; }
|
||||
std::vector<FairMQRegionInfo> GetRegionInfo() override { LOG(error) << "GetRegionInfo not yet implemented for OFI, returning empty vector"; return std::vector<FairMQRegionInfo>(); }
|
||||
auto CreateMessage(std::size_t size) -> std::unique_ptr<mq::Message> override
|
||||
{
|
||||
return std::make_unique<Message>(&fMemoryResource, size);
|
||||
}
|
||||
|
||||
auto GetType() const -> Transport override;
|
||||
auto CreateMessage(std::size_t size, Alignment /*alignment*/)
|
||||
-> std::unique_ptr<mq::Message> override
|
||||
{
|
||||
// TODO Do not ignore alignment
|
||||
return std::make_unique<Message>(&fMemoryResource, size);
|
||||
}
|
||||
|
||||
auto CreateMessage(void* data, std::size_t size, fairmq_free_fn* ffn, void* hint = nullptr)
|
||||
-> std::unique_ptr<mq::Message> override
|
||||
{
|
||||
return std::make_unique<Message>(&fMemoryResource, data, size, ffn, hint);
|
||||
}
|
||||
|
||||
auto CreateMessage(std::unique_ptr<mq::UnmanagedRegion>& region,
|
||||
void* data,
|
||||
std::size_t size,
|
||||
void* hint = nullptr) -> std::unique_ptr<mq::Message> override
|
||||
{
|
||||
return std::make_unique<Message>(&fMemoryResource, region, data, size, hint);
|
||||
}
|
||||
|
||||
auto CreateSocket(std::string const& type, std::string const& name)
|
||||
-> std::unique_ptr<mq::Socket> override
|
||||
{
|
||||
return std::make_unique<Socket>(fContext, type, name, GetId());
|
||||
}
|
||||
|
||||
auto CreatePoller(std::vector<mq::Channel> const& /*channels*/) const
|
||||
-> std::unique_ptr<mq::Poller> override
|
||||
{
|
||||
throw std::runtime_error("Not yet implemented (Poller).");
|
||||
}
|
||||
|
||||
auto CreatePoller(std::vector<mq::Channel*> const& /*channels*/) const
|
||||
-> std::unique_ptr<mq::Poller> override
|
||||
{
|
||||
throw std::runtime_error("Not yet implemented (Poller).");
|
||||
}
|
||||
|
||||
auto CreatePoller(
|
||||
std::unordered_map<std::string, std::vector<FairMQChannel>> const& /*channelsMap*/,
|
||||
std::vector<std::string> const& /*channelList*/) const
|
||||
-> std::unique_ptr<mq::Poller> override
|
||||
{
|
||||
throw std::runtime_error("Not yet implemented (Poller).");
|
||||
}
|
||||
|
||||
auto CreateUnmanagedRegion(std::size_t /*size*/,
|
||||
RegionCallback /*callback = nullptr*/,
|
||||
std::string const& /*path = ""*/,
|
||||
int /*flags = 0*/,
|
||||
RegionConfig /*cfg = RegionConfig()*/)
|
||||
-> std::unique_ptr<mq::UnmanagedRegion> override
|
||||
{
|
||||
throw std::runtime_error("Not yet implemented UMR.");
|
||||
}
|
||||
|
||||
auto CreateUnmanagedRegion(std::size_t /*size*/,
|
||||
RegionBulkCallback /*callback = nullptr*/,
|
||||
std::string const& /*path = ""*/,
|
||||
int /*flags = 0*/,
|
||||
RegionConfig /*cfg = RegionConfig()*/)
|
||||
-> std::unique_ptr<mq::UnmanagedRegion> override
|
||||
{
|
||||
throw std::runtime_error("Not yet implemented UMR.");
|
||||
}
|
||||
|
||||
auto CreateUnmanagedRegion(std::size_t /*size*/,
|
||||
int64_t /*userFlags*/,
|
||||
RegionCallback /*callback = nullptr*/,
|
||||
std::string const& /*path = ""*/,
|
||||
int /*flags = 0*/,
|
||||
RegionConfig /*cfg = RegionConfig()*/)
|
||||
-> std::unique_ptr<mq::UnmanagedRegion> override
|
||||
{
|
||||
throw std::runtime_error("Not yet implemented UMR.");
|
||||
}
|
||||
|
||||
auto CreateUnmanagedRegion(std::size_t /*size*/,
|
||||
int64_t /*userFlags*/,
|
||||
RegionBulkCallback /*callback = nullptr*/,
|
||||
std::string const& /*path = ""*/,
|
||||
int /*flags = 0*/,
|
||||
RegionConfig /*cfg = RegionConfig()*/)
|
||||
-> std::unique_ptr<mq::UnmanagedRegion> override
|
||||
{
|
||||
throw std::runtime_error("Not yet implemented UMR.");
|
||||
}
|
||||
|
||||
auto SubscribeToRegionEvents(RegionEventCallback /*callback*/) -> void override
|
||||
{
|
||||
throw std::runtime_error("Not yet implemented.");
|
||||
}
|
||||
|
||||
auto SubscribedToRegionEvents() -> bool override
|
||||
{
|
||||
throw std::runtime_error("Not yet implemented.");
|
||||
}
|
||||
|
||||
auto UnsubscribeFromRegionEvents() -> void override
|
||||
{
|
||||
throw std::runtime_error("Not yet implemented.");
|
||||
}
|
||||
|
||||
auto GetRegionInfo() -> std::vector<RegionInfo> override
|
||||
{
|
||||
LOG(error) << "GetRegionInfo not yet implemented for OFI, returning empty vector";
|
||||
return std::vector<RegionInfo>();
|
||||
}
|
||||
|
||||
auto GetType() const -> Transport override { return Transport::OFI; }
|
||||
|
||||
void Interrupt() override { fContext.Interrupt(); }
|
||||
void Resume() override { fContext.Resume(); }
|
||||
@@ -63,8 +195,8 @@ class TransportFactory final : public FairMQTransportFactory
|
||||
private:
|
||||
mutable Context fContext;
|
||||
asiofi::allocated_pool_resource fMemoryResource;
|
||||
}; /* class TransportFactory */
|
||||
}; /* class TransportFactory */
|
||||
|
||||
} // namespace fair::mq::ofi
|
||||
} // namespace fair::mq::ofi
|
||||
|
||||
#endif /* FAIR_MQ_OFI_TRANSPORTFACTORY_H */
|
||||
|
Reference in New Issue
Block a user