summaryrefslogtreecommitdiffstats
path: root/epoll.c
diff options
context:
space:
mode:
authorSimon Rettberg2014-03-15 01:49:50 +0100
committerSimon Rettberg2014-03-15 01:49:50 +0100
commitbedd2e7ccb1595c23e159eaa952ae1b0b5a3d2ad (patch)
treec7d1995a09f6ed0c4e6873252e957d72f5d07d07 /epoll.c
downloadldadp-bedd2e7ccb1595c23e159eaa952ae1b0b5a3d2ad.tar.gz
ldadp-bedd2e7ccb1595c23e159eaa952ae1b0b5a3d2ad.tar.xz
ldadp-bedd2e7ccb1595c23e159eaa952ae1b0b5a3d2ad.zip
Lean and mean initial commit
Not much functionality yet
Diffstat (limited to 'epoll.c')
-rw-r--r--epoll.c43
1 files changed, 43 insertions, 0 deletions
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 <errno.h>
+
+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);
+}
+