Implement S/G IO for non-batched sends and eliminate more data copies (#2867)
This commit is contained in:
@@ -620,8 +620,10 @@ namespace platf {
|
||||
send_batch(batched_send_info_t &send_info);
|
||||
|
||||
struct send_info_t {
|
||||
const char *buffer;
|
||||
size_t size;
|
||||
const char *header;
|
||||
size_t header_size;
|
||||
const char *payload;
|
||||
size_t payload_size;
|
||||
|
||||
std::uintptr_t native_socket;
|
||||
boost::asio::ip::address &target_address;
|
||||
|
||||
@@ -606,12 +606,19 @@ namespace platf {
|
||||
memcpy(CMSG_DATA(pktinfo_cm), &pktInfo, sizeof(pktInfo));
|
||||
}
|
||||
|
||||
struct iovec iov = {};
|
||||
iov.iov_base = (void *) send_info.buffer;
|
||||
iov.iov_len = send_info.size;
|
||||
struct iovec iovs[2] = {};
|
||||
int iovlen = 0;
|
||||
if (send_info.header) {
|
||||
iovs[iovlen].iov_base = (void *) send_info.header;
|
||||
iovs[iovlen].iov_len = send_info.header_size;
|
||||
iovlen++;
|
||||
}
|
||||
iovs[iovlen].iov_base = (void *) send_info.payload;
|
||||
iovs[iovlen].iov_len = send_info.payload_size;
|
||||
iovlen++;
|
||||
|
||||
msg.msg_iov = &iov;
|
||||
msg.msg_iovlen = 1;
|
||||
msg.msg_iov = iovs;
|
||||
msg.msg_iovlen = iovlen;
|
||||
|
||||
msg.msg_controllen = cmbuflen;
|
||||
|
||||
|
||||
@@ -363,12 +363,19 @@ namespace platf {
|
||||
memcpy(CMSG_DATA(pktinfo_cm), &pktInfo, sizeof(pktInfo));
|
||||
}
|
||||
|
||||
struct iovec iov = {};
|
||||
iov.iov_base = (void *) send_info.buffer;
|
||||
iov.iov_len = send_info.size;
|
||||
struct iovec iovs[2] = {};
|
||||
int iovlen = 0;
|
||||
if (send_info.header) {
|
||||
iovs[iovlen].iov_base = (void *) send_info.header;
|
||||
iovs[iovlen].iov_len = send_info.header_size;
|
||||
iovlen++;
|
||||
}
|
||||
iovs[iovlen].iov_base = (void *) send_info.payload;
|
||||
iovs[iovlen].iov_len = send_info.payload_size;
|
||||
iovlen++;
|
||||
|
||||
msg.msg_iov = &iov;
|
||||
msg.msg_iovlen = 1;
|
||||
msg.msg_iov = iovs;
|
||||
msg.msg_iovlen = iovlen;
|
||||
|
||||
msg.msg_controllen = cmbuflen;
|
||||
|
||||
|
||||
@@ -1535,12 +1535,19 @@ namespace platf {
|
||||
msg.namelen = sizeof(taddr_v4);
|
||||
}
|
||||
|
||||
WSABUF buf;
|
||||
buf.buf = (char *) send_info.buffer;
|
||||
buf.len = send_info.size;
|
||||
WSABUF bufs[2];
|
||||
DWORD bufcount = 0;
|
||||
if (send_info.header) {
|
||||
bufs[bufcount].buf = (char *) send_info.header;
|
||||
bufs[bufcount].len = send_info.header_size;
|
||||
bufcount++;
|
||||
}
|
||||
bufs[bufcount].buf = (char *) send_info.payload;
|
||||
bufs[bufcount].len = send_info.payload_size;
|
||||
bufcount++;
|
||||
|
||||
msg.lpBuffers = &buf;
|
||||
msg.dwBufferCount = 1;
|
||||
msg.lpBuffers = bufs;
|
||||
msg.dwBufferCount = bufcount;
|
||||
msg.dwFlags = 0;
|
||||
|
||||
char cmbuf[std::max(WSA_CMSG_SPACE(sizeof(IN6_PKTINFO)), WSA_CMSG_SPACE(sizeof(IN_PKTINFO)))] = {};
|
||||
|
||||
Reference in New Issue
Block a user