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(); }