.. _program_listing_file_BackendLibfabric_SendSocketBuffered.cpp: Program Listing for File SendSocketBuffered.cpp =============================================== |exhale_lsh| :ref:`Return to documentation for file ` (``BackendLibfabric/SendSocketBuffered.cpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #include "SendSocketBuffered.hpp" #include #include #include "Issues.hpp" netio3::libfabric::SendSocketBuffered::SendSocketBuffered( EndPointAddress address, const ConnectionParameters& connection_params, NetworkMode mode, fid_fabric* fabric, DomainContext& domain) : SendSocket{std::move(address), mode, fabric, domain.get_domain()}, m_conn_parameters{prepare_connection_parameters(connection_params)} { init_buffers(domain); init(); } netio3::libfabric::SendSocketBuffered::~SendSocketBuffered() { ERS_DEBUG(2, "Entered"); for (const auto& buffer : m_buffers) { close_buffer(buffer); } ERS_DEBUG(2, "Finished"); } std::size_t netio3::libfabric::SendSocketBuffered::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::SendSocketBuffered::init_buffers(DomainContext& domain) { ZoneScoped; ERS_DEBUG(2, std::format("Registering {} buffers of size {}", m_conn_parameters.num_buf, m_conn_parameters.buf_size)); for (std::uint64_t key = 0; key < m_conn_parameters.num_buf; ++key) { m_buffers.emplace_back(domain, m_conn_parameters.buf_size, key); try { register_buffer(m_buffers.back(), domain, FI_SEND); } catch (const LibFabricBufferError& e) { throw FailedOpenSendEndpoint( ERS_HERE, get_address().address(), get_address().port(), e.message()); } m_available_buffers.push(key); ++m_num_available_buffers; } m_min_num_available_buffers = m_num_available_buffers.load(); } netio3::ConnectionParameters netio3::libfabric::SendSocketBuffered::prepare_connection_parameters( const ConnectionParameters& requested) const { auto params = requested; const auto& info = get_endpoint().fi; if (params.num_buf > info->tx_attr->size) { ers::warning(TooManyBuffersRequested(params.num_buf, info->tx_attr->size)); params.num_buf = info->tx_attr->size; } return params; }