Program Listing for File publisher.cpp
↰ Return to documentation for file (publisher.cpp)
#include "publisher.hpp"
#include "monitoring/tohost_monitor.hpp"
#include "ers/ers.h"
#include <format>
std::uint8_t Publisher::truncate_msg_if_too_large(std::span<iovec>& iov, std::uint8_t status)
{
[[maybe_unused]] const auto original_iov_size = iov.size();
//IOV length
if (m_max_iov_len != 0 and iov.size() > m_max_iov_len) {
iov = iov.subspan(0, m_max_iov_len);
ERS_DEBUG(1, std::format( "Truncating to IOV {}", m_max_iov_len));
status |= SW_TRUNC;
}
//Max message size
size_t byte_counter = 0; // status byte
for (uint32_t i = 0; i < iov.size(); ++i){
byte_counter += iov[i].iov_len;
if (byte_counter > m_max_msg_size){
size_t retain_iov_len = iov[i].iov_len - (byte_counter - m_max_msg_size);
if (retain_iov_len == 0){
ERS_DEBUG(1, std::format( "Truncating IOV: length was {} now is {}", original_iov_size, i));
iov = iov.subspan(0, i);
} else {
ERS_DEBUG(1, std::format( "Truncating IOV and last entry: length was {} now is {}, last entry was {} bytes, now {}", original_iov_size, i+1, iov[i].iov_len, retain_iov_len));
iov = iov.subspan(0, i + 1);
iov[i].iov_len = retain_iov_len;
}
status |= SW_TRUNC;
}
}
return status;
}