ext/inc/epoll.h in nyara-0.0.1.pre.2 vs ext/inc/epoll.h in nyara-0.0.1.pre.3
- old
+ new
@@ -1,14 +1,16 @@
+/* epoll event adapter */
+
#pragma once
#include <sys/epoll.h>
static struct epoll_event qevents[MAX_E];
static void ADD_E(int fd, uint64_t etype) {
struct epoll_event e;
- e.events = EPOLLIN;
+ e.events = EPOLLIN | EPOLLOUT;
e.data.u64 = (etype << 32) | (uint64_t)fd;
// todo timeout
# ifdef NDEBUG
epoll_ctl(qfd, EPOLL_CTL_ADD, fd, &e);
@@ -16,13 +18,15 @@
if (epoll_ctl(qfd, EPOLL_CTL_ADD, fd, &e))
printf("%s: %s\n", __func__, strerror(errno));
# endif
}
+// either epoll or kqueue removes the event watch from queue when fd closed
+// seems this is not required in epoll?
static void DEL_E(int fd) {
struct epoll_event e;
- e.events = EPOLLIN;
+ e.events = EPOLLIN | EPOLLOUT;
e.data.ptr = NULL;
# ifdef NDEBUG
epoll_ctl(qfd, EPOLL_CTL_DEL, fd, &e);
# else
@@ -43,16 +47,14 @@
while (1) {
// heart beat of 0.1 sec, allow ruby signal interrupts to be inserted
int sz = epoll_wait(qfd, qevents, MAX_E, 100);
for (int i = 0; i < sz; i++) {
- switch (qevents[i].events) {
- case EPOLLIN: {
- int fd = (int)(qevents[i].data.u64 & 0xFFFFFFFF);
- int etype = (int)(qevents[i].data.u64 >> 32);
- loop_body(fd, etype);
- break;
- }
+ if (qevents[i].events & (EPOLLIN | EPOLLOUT)) {
+ int fd = (int)(qevents[i].data.u64 & 0xFFFFFFFF);
+ int etype = (int)(qevents[i].data.u64 >> 32);
+ loop_body(fd, etype);
+ break;
}
}
// execute other thread / interrupts
rb_thread_schedule();
}