in gloo/transport/tcp/pair.cc [282:333]
ssize_t Pair::prepareWrite(
Op& op,
const NonOwningPtr<UnboundBuffer>& buf,
struct iovec* iov,
int& ioc) {
ssize_t len = 0;
ioc = 0;
// Include preamble if necessary
if (op.nwritten < sizeof(op.preamble)) {
iov[ioc].iov_base = ((char*)&op.preamble) + op.nwritten;
iov[ioc].iov_len = sizeof(op.preamble) - op.nwritten;
len += iov[ioc].iov_len;
ioc++;
}
auto opcode = op.getOpcode();
// Send data to a remote buffer
if (opcode == Op::SEND_BUFFER) {
char* ptr = (char*)op.buf->ptr_;
size_t offset = op.preamble.offset;
size_t nbytes = op.preamble.length;
if (op.nwritten > sizeof(op.preamble)) {
offset += op.nwritten - sizeof(op.preamble);
nbytes -= op.nwritten - sizeof(op.preamble);
}
iov[ioc].iov_base = ptr + offset;
iov[ioc].iov_len = nbytes;
len += iov[ioc].iov_len;
ioc++;
return len;
}
// Send data to a remote unbound buffer
if (opcode == Op::SEND_UNBOUND_BUFFER) {
char* ptr = (char*)buf->ptr;
size_t offset = op.offset;
size_t nbytes = op.nbytes;
if (op.nwritten > sizeof(op.preamble)) {
offset += op.nwritten - sizeof(op.preamble);
nbytes -= op.nwritten - sizeof(op.preamble);
}
iov[ioc].iov_base = ptr + offset;
iov[ioc].iov_len = nbytes;
len += iov[ioc].iov_len;
ioc++;
return len;
}
return len;
}