From 3ae9ac29c517763212baec8069b4ed6bfdaa7280 Mon Sep 17 00:00:00 2001 From: Egor Date: Sat, 21 Oct 2023 19:15:26 +0300 Subject: [PATCH] netpoll: add epoll implementation --- src/netpoll.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/netpoll.c b/src/netpoll.c index b06a42b..93b7cb1 100644 --- a/src/netpoll.c +++ b/src/netpoll.c @@ -131,6 +131,73 @@ int net_poll_get(struct net_pollfd *out) *out = fds[lastptr-1]; return ev; } +#elif defined(NETPOLL_USE_EPOLL) +#include +static int epollfd = -1; +static struct epoll_event events[256] = {0}; +static int nevents = 0; +static int lastptr = 0; +void net_poll_init(void) +{ + epollfd = epoll_create1(EPOLL_CLOEXEC); + if (epollfd == -1) { + perror("epoll_create"); + abort(); + } +} +void net_poll_fini(void) +{ + close(epollfd); + epollfd = -1; +} +void net_poll_add_impl(int i) +{ + struct epoll_event e = { .data.fd = fds[i].fd }; + if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fds[i].fd, &e) == -1) { + perror("epoll_ctl(EPOLL_CTL_ADD)"); + abort(); + } +} +void net_poll_del_impl(int i) +{ + if (epoll_ctl(epollfd, EPOLL_CTL_DEL, fds[i].fd, 0) == -1) { + perror("epoll_ctl(EPOLL_CTL_DEL)"); + abort(); + } +} +void net_poll_reg_impl(int i, int ev) +{ + struct epoll_event e = { .data.fd = fds[i].fd }; + e.events = (ev & NETPOLL_IN ? EPOLLIN : 0) | (ev & NETPOLL_OUT ? EPOLLOUT : 0); + if (epoll_ctl(epollfd, EPOLL_CTL_MOD, fds[i].fd, &e) == -1) { + perror("epoll_ctl(EPOLL_CTL_MOD)"); + abort(); + } +} +int net_poll_begin(void) +{ + int rv = epoll_wait(epollfd, events, sizeof(events)/sizeof(events[0]), -1); + lastptr = 0; + nevents = rv; + return rv; +} +int net_poll_get(struct net_pollfd *out) +{ + int ev = 0; + while (!ev) { + if (lastptr == nevents) + return 0; + int pev = events[lastptr].events; + if (pev & EPOLLIN) + ev |= NETPOLL_IN; + if (pev & EPOLLOUT) + ev |= NETPOLL_OUT; + lastptr++; + } + /* FIXME: this is stupid */ + *out = fds[search(events[lastptr-1].data.fd)]; + return ev; +} #else #error pick a netpoll implementation #endif -- 2.56.0