Program Listing for File SendEndpointZeroCopy.hpp

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

#ifndef NETIO3BACKEND_BACKENDLIBFABRIC_SENDENDPOINTZEROCOPY_HPP
#define NETIO3BACKEND_BACKENDLIBFABRIC_SENDENDPOINTZEROCOPY_HPP

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

#include <tbb/concurrent_queue.h>

#include "ActiveEndpoint.hpp"
#include "DomainManager.hpp"
#include "Helpers.hpp"
#include "netio3-backend/Netio3Backend.hpp"
#include "Sender.hpp"
#include "ZeroCopyBufferManager.hpp"

namespace netio3::libfabric {
  class SendEndpointZeroCopy
  {
  public:
    SendEndpointZeroCopy(ActiveEndpoint& endpoint,
                         const ConnectionParametersSendZeroCopy& connection_params,
                         std::optional<ZeroCopyBufferManager>& shared_buffer_manager,
                         DomainManager& domain_manager);

    [[nodiscard]] auto operator<=>(const SendEndpointZeroCopy& other) const
    {
      return m_endpoint.get().get_endpoint().ep <=> other.m_endpoint.get().get_endpoint().ep;
    }

    [[nodiscard]] const ActiveEndpoint& get_active_endpoint() const { return m_endpoint.get(); }
    [[nodiscard]] ActiveEndpoint& get_active_endpoint() { return m_endpoint.get(); }

    [[nodiscard]] NetioStatus send_data(std::span<std::uint8_t> data,
                                        std::span<const std::uint8_t> header_data,
                                        std::uint64_t key,
                                        fi_addr_t addr = 0);

    [[nodiscard]] NetioStatus send_data(std::span<const iovec> iov,
                                        std::span<const std::uint8_t> header_data,
                                        std::uint64_t key,
                                        fi_addr_t addr = 0);

    [[nodiscard]] std::uint64_t release_buffer(std::uint64_t bufnum);

    [[nodiscard]] std::size_t get_num_available_buffers();

    [[nodiscard]] std::vector<std::uint64_t> get_pending_sends();

  private:
    [[nodiscard]] std::optional<ZeroCopyBufferManager> create_buffer_manager(
      const ConnectionParametersSendZeroCopy& connection_params,
      DomainManager& domain_manager) const;

    std::reference_wrapper<ActiveEndpoint> m_endpoint;
    ConnectionParametersSendZeroCopy m_conn_parameters{};
    Sender m_sender;
    std::optional<ZeroCopyBufferManager> m_buffer_manager;
    ZeroCopyBufferManager* m_buffer_manager_ptr{nullptr};
  };
}  // namespace netio3::libfabric

#endif  // NETIO3BACKEND_BACKENDLIBFABRIC_SENDENDPOINTZEROCOPY_HPP