/******************************************************************************** * 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, * * copied verbatim in the file "LICENSE" * ********************************************************************************/ #ifndef FAIR_MQ_OFI_TRANSPORTFACTORY_H #define FAIR_MQ_OFI_TRANSPORTFACTORY_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace fair::mq::ofi { /** * @class TransportFactory TransportFactory.h * @brief FairMQ transport factory for the ofi transport * * @todo TODO insert long description */ struct TransportFactory final : mq::TransportFactory { TransportFactory(std::string const& id = "", ProgOptions const* config = nullptr) : mq::TransportFactory(id) , fContext(*this, *this, 1) { try { LOG(debug) << "OFI transport: asiofi (" << fContext.GetAsiofiVersion() << ")"; if (config) { fContext.SetSizeHint(config->GetProperty("ofi-size-hint", 0)); } } catch (ContextError& e) { throw TransportFactoryError(e.what()); } } TransportFactory(const TransportFactory&) = delete; TransportFactory(TransportFactory&&) = delete; TransportFactory& operator=(const TransportFactory&) = delete; TransportFactory& operator=(TransportFactory&&) = delete; ~TransportFactory() override = default; auto CreateMessage() -> std::unique_ptr override { return std::make_unique(&fMemoryResource); } auto CreateMessage(Alignment /*alignment*/) -> std::unique_ptr override { // TODO Do not ignore alignment return std::make_unique(&fMemoryResource); } auto CreateMessage(std::size_t size) -> std::unique_ptr override { return std::make_unique(&fMemoryResource, size); } auto CreateMessage(std::size_t size, Alignment /*alignment*/) -> std::unique_ptr override { // TODO Do not ignore alignment return std::make_unique(&fMemoryResource, size); } auto CreateMessage(void* data, std::size_t size, fairmq_free_fn* ffn, void* hint = nullptr) -> std::unique_ptr override { return std::make_unique(&fMemoryResource, data, size, ffn, hint); } auto CreateMessage(std::unique_ptr& region, void* data, std::size_t size, void* hint = nullptr) -> std::unique_ptr override { return std::make_unique(&fMemoryResource, region, data, size, hint); } auto CreateSocket(std::string const& type, std::string const& name) -> std::unique_ptr override { return std::make_unique(fContext, type, name, GetId()); } auto CreatePoller(std::vector const& /*channels*/) const -> std::unique_ptr override { throw std::runtime_error("Not yet implemented (Poller)."); } auto CreatePoller(std::vector const& /*channels*/) const -> std::unique_ptr override { throw std::runtime_error("Not yet implemented (Poller)."); } auto CreatePoller( std::unordered_map> const& /*channelsMap*/, std::vector const& /*channelList*/) const -> std::unique_ptr 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 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 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 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 override { throw std::runtime_error("Not yet implemented UMR."); } auto CreateUnmanagedRegion(std::size_t /*size*/, RegionCallback /*callback*/, RegionConfig /*cfg*/) -> std::unique_ptr override { throw std::runtime_error("Not yet implemented UMR."); } auto CreateUnmanagedRegion(std::size_t /*size*/, RegionBulkCallback /*callback*/, RegionConfig /*cfg*/) -> std::unique_ptr 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 override { LOG(error) << "GetRegionInfo not yet implemented for OFI, returning empty vector"; return std::vector(); } auto GetType() const -> Transport override { return Transport::OFI; } void Interrupt() override { fContext.Interrupt(); } void Resume() override { fContext.Resume(); } void Reset() override { fContext.Reset(); } private: mutable Context fContext; asiofi::allocated_pool_resource fMemoryResource; }; /* class TransportFactory */ } // namespace fair::mq::ofi #endif /* FAIR_MQ_OFI_TRANSPORTFACTORY_H */