Program Listing for File SendBufferManager.cpp

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

#include "SendBufferManager.hpp"

#include <tracy/Tracy.hpp>

netio3::libfabric::SendBufferManager::SendBufferManager(
  ConnectionParametersSendBuffered connection_params,
  DomainManager& domain_manager) :
  m_conn_parameters{std::move(connection_params)}
{
  init_buffers(domain_manager);
}

netio3::libfabric::SendBufferManager::~SendBufferManager()
{
  ERS_DEBUG(2, "Entered");
  for (const auto& buffer : m_buffers) {
    close_buffer(buffer);
  }
  ERS_DEBUG(2, "Finished");
}

std::size_t netio3::libfabric::SendBufferManager::get_num_available_buffers()
{
  ZoneScoped;
  return m_min_num_available_buffers.exchange(
    m_num_available_buffers.load(std::memory_order_relaxed), std::memory_order_relaxed);
}

void netio3::libfabric::SendBufferManager::init_buffers(DomainManager& domain_manager)
{
  ZoneScoped;
  ERS_DEBUG(2,
            std::format("Registering  {} buffers of size {}",
                        m_conn_parameters.num_buf,
                        m_conn_parameters.buf_size));
  m_buffers.reserve(m_conn_parameters.num_buf);
  for (std::uint64_t key = 0; key < m_conn_parameters.num_buf; ++key) {
    m_buffers.emplace_back(m_conn_parameters.buf_size, key);
    register_buffer(m_buffers.back(), domain_manager, FI_SEND);
    m_available_buffers.push(key);
    ++m_num_available_buffers;
  }
  m_min_num_available_buffers = m_num_available_buffers.load();
}