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&);