Zero-copy read

master
Vitaliy Filippov 2021-10-23 23:55:38 +03:00
parent 22e71c2c12
commit bceb7d5328
1 changed files with 22 additions and 4 deletions

View File

@ -72,9 +72,21 @@ int loop(void *arg)
}
else if (events[i].events & EPOLLIN)
{
size_t readlen = vppcom_session_read(events[i].data.fd, buf, message_size);
vppcom_data_segment_t seg[8];
size_t readlen = vppcom_session_read_segments(
events[i].data.fd, seg, sizeof(seg)/sizeof(seg[0]), message_size
);
if (readlen > 0)
vppcom_session_write(events[i].data.fd, buf, readlen);
{
size_t left = readlen;
for (int i = 0; left > 0; i++)
{
vppcom_session_write(events[i].data.fd, seg[i].data, seg[i].len);
left -= seg[i].len;
}
// FIXME: I'm not sure if I can do that. Maybe the buffer can't be freed until it's really sent
vppcom_session_free_segments(events[i].data.fd, readlen);
}
else
{
vppcom_epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL);
@ -129,6 +141,7 @@ int loop_client(void *arg)
if (events[i].events & (EPOLLHUP|EPOLLERR))
{
/* Simply close socket */
printf("Error event\n");
vppcom_epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL);
vppcom_session_close(events[i].data.fd);
sigint_handler(SIGINT);
@ -139,9 +152,14 @@ int loop_client(void *arg)
/* Read everything back */
if (to_read > 0)
{
len = vppcom_session_read(events[i].data.fd, buf, message_size);
vppcom_data_segment_t seg[8];
len = vppcom_session_read_segments(
events[i].data.fd, seg, sizeof(seg)/sizeof(seg[0]), to_read
);
if (len > 0)
to_read = to_read > len ? to_read-len : 0;
// FIXME: I'm not sure if I can do that. Maybe the buffer can't be freed until it's really sent
vppcom_session_free_segments(events[i].data.fd, len);
if (to_read == 0)
{
/* Calculate latency */
@ -297,7 +315,7 @@ int main(int argc, char *argv[])
assert((epfd = vppcom_epoll_create()) > 0);
ev.data.fd = sockfd;
ev.events = (server ? EPOLLOUT : 0) | EPOLLIN|EPOLLHUP;
ev.events = (server ? EPOLLOUT : 0) | EPOLLIN|EPOLLHUP|EPOLLET;
rv = vppcom_epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev);
if (rv < 0)
{