Program Listing for File Buffer.cpp

Return to documentation for file (BackendLibfabric/Buffer.cpp)

#include "Buffer.hpp"

#include <set>

#include <rdma/fi_domain.h>

#include <tracy/Tracy.hpp>

#include "Issues.hpp"

std::vector<std::uint64_t> netio3::libfabric::HeaderBuffer::get_pending_sends()
{
  std::set<std::uint64_t> indices{};
  std::ranges::generate_n(std::inserter(indices, indices.end()), ZERO_COPY_NUM_HEADER_SLOTS, [i = 0]() mutable { return i++; });
  std::size_t index_available{};
  while(m_available_header_buffers.try_pop(index_available))
  {
    indices.erase(index_available);
  }
  std::vector<std::uint64_t> keys{};
  std::ranges::transform(
    indices, std::back_inserter(keys), [this](std::size_t index_not_available) {
      return m_keys[index_not_available];
    });
  return keys;
}

template<netio3::libfabric::BufferConcept BufferType>
void netio3::libfabric::register_buffer(BufferType& buf,
                                        DomainManager& domain_manager,
                                        const int access_flag)
{
  ZoneScoped;
  ERS_DEBUG(1,
            std::format("Registering buffer of size {} for domain: {}",
                        buf.get_size(),
                        static_cast<void*>(domain_manager.get_domain())));
  const auto ret = fi_mr_reg(
    domain_manager.get_domain(), buf.get_buffer(), buf.get_size(), access_flag, 0, domain_manager.get_next_mr_key(), 0, &buf.mr, nullptr);
  if (ret != 0) {
    throw LibFabricBufferError(
      ERS_HERE,
      std::format("Failed to register buffer failed. Error {} - {}", ret, fi_strerror(-ret)));
  }
}

template<netio3::libfabric::BufferConcept BufferType>
void netio3::libfabric::close_buffer(const BufferType& buffer)
{
  const auto ret = fi_close(&buffer.mr->fid);
  if (ret != 0) {
    throw LibFabricBufferError(
      ERS_HERE,
      std::format("Failed to close buffer failed. Error {} - {}", ret, fi_strerror(-ret)));
  }
}

template void netio3::libfabric::register_buffer<netio3::libfabric::Buffer>(
  netio3::libfabric::Buffer&,
  DomainManager&,
  int);
template void netio3::libfabric::register_buffer<netio3::libfabric::HeaderBuffer>(
  netio3::libfabric::HeaderBuffer&,
  DomainManager&,
  int);

template void netio3::libfabric::close_buffer<netio3::libfabric::Buffer>(
  const netio3::libfabric::Buffer&);
template void netio3::libfabric::close_buffer<netio3::libfabric::HeaderBuffer>(
  const netio3::libfabric::HeaderBuffer&);