Program Listing for File AddressVectorManager.hpp

Return to documentation for file (BackendLibfabric/AddressVectorManager.hpp)

#ifndef NETIO3BACKEND_BACKENDLIBFABRIC_ADRESSVECTORMANAGER_HPP
#define NETIO3BACKEND_BACKENDLIBFABRIC_ADRESSVECTORMANAGER_HPP

#include <unordered_map>

#include <rdma/fabric.h>
#include <rdma/fi_domain.h>

#include "Helpers.hpp"
#include "netio3-backend/Netio3Backend.hpp"

namespace netio3::libfabric {
  class AddressVectorManager
  {
  public:
    explicit AddressVectorManager(fid_domain* domain, NetworkMode mode);

    ~AddressVectorManager() = default;

    AddressVectorManager(const AddressVectorManager&) = delete;
    AddressVectorManager& operator=(const AddressVectorManager&) = delete;
    AddressVectorManager(AddressVectorManager&&) = default;
    AddressVectorManager& operator=(AddressVectorManager&&) = default;

    [[nodiscard]] fi_addr_t add_address(const EndPointAddress& address);

    void remove_address(const EndPointAddress& address);

    [[nodiscard]] const fid_av* get_av() const { return m_av.get(); }
    [[nodiscard]] fid_av* get_av() { return m_av.get(); }

  private:
    [[nodiscard]] static fid_av* create_av(fid_domain* domain);

    constexpr static auto entry_count{1024};
    FiCloseUniquePtr<fid_av> m_av{nullptr};
    NetworkMode m_mode{};
    std::unordered_map<EndPointAddress, fi_addr_t, EndPointAddress::Hash> m_address_map;
  };
}  // namespace netio3::libfabric

#endif  // NETIO3BACKEND_BACKENDLIBFABRIC_ADRESSVECTORMANAGER_HPP