From bedd2e7ccb1595c23e159eaa952ae1b0b5a3d2ad Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Sat, 15 Mar 2014 01:49:50 +0100 Subject: Lean and mean initial commit Not much functionality yet --- epoll.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 epoll.c (limited to 'epoll.c') diff --git a/epoll.c b/epoll.c new file mode 100644 index 0000000..576fb0e --- /dev/null +++ b/epoll.c @@ -0,0 +1,43 @@ +#include "epoll.h" +#include + +static int efd = -1; +#define MAXEVENTS 10 +static struct epoll_event events[MAXEVENTS]; + +int ePoll_init() +{ + if (efd != -1) return 0; + efd = epoll_create1(0); + if (efd == -1) return -1; + return 0; +} + +int ePoll_wait(const int timeoutMs) +{ + const int num = epoll_wait(efd, events, MAXEVENTS, timeoutMs); + if (num < 0 && (errno == EINTR || errno == EAGAIN)) return 0; + if (num < 0) return -1; + for (int i = 0; i < num; ++i) { + epoll_item_t *data = (epoll_item_t *)events[i].data.ptr; + (*data->callback)(data, events[i].events & EPOLLIN, events[i].events & EPOLLOUT, events[i].events & (EPOLLERR | EPOLLHUP)); + } + return 0; +} + +/** + * Returns -1 on error, just like epoll_ctl + */ +int ePoll_add(uint32_t flags, epoll_item_t* callback) +{ + struct epoll_event event; + event.data.ptr = (void*)callback; + event.events = flags; + return epoll_ctl(efd, EPOLL_CTL_ADD, callback->fd, &event); +} + +int ePoll_remove(int fd) +{ + return epoll_ctl(efd, EPOLL_CTL_DEL, fd, (struct epoll_event*)67775); +} + -- cgit v1.2.3-55-g7522