From 79b69fe6efec81b097bd2e3cc48dc929790044a1 Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Tue, 22 Aug 2017 17:30:00 +0200 Subject: [PATCH] Add experimental support for EPOLLPRI to the epoll backend Signed-off-by: Michal Sojka --- ev++.h | 1 + ev.h | 1 + ev_epoll.c | 9 ++++++--- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/ev++.h b/ev++.h index 4f0a36a..28a45fa 100644 --- a/ev++.h +++ b/ev++.h @@ -63,6 +63,7 @@ namespace ev { NONE = EV_NONE, READ = EV_READ, WRITE = EV_WRITE, + EXCEPTION= EV_EXCEPTION, #if EV_COMPAT3 TIMEOUT = EV_TIMEOUT, #endif diff --git a/ev.h b/ev.h index db93777..9f0842d 100644 --- a/ev.h +++ b/ev.h @@ -219,6 +219,7 @@ enum { EV_NONE = 0x00, /* no events */ EV_READ = 0x01, /* ev_io detected read will not block */ EV_WRITE = 0x02, /* ev_io detected write will not block */ + EV_EXCEPTION= 0x04, /* ev_io detected exceptional condition */ EV__IOFDSET = 0x80, /* internal use only */ EV_IO = EV_READ, /* alias for type-detection */ EV_TIMER = 0x00000100, /* timer timed out */ diff --git a/ev_epoll.c b/ev_epoll.c index 6aef862..02112c7 100644 --- a/ev_epoll.c +++ b/ev_epoll.c @@ -91,7 +91,8 @@ epoll_modify (EV_P_ int fd, int oev, int nev) ev.data.u64 = (uint64_t)(uint32_t)fd | ((uint64_t)(uint32_t)++anfds [fd].egen << 32); ev.events = (nev & EV_READ ? EPOLLIN : 0) - | (nev & EV_WRITE ? EPOLLOUT : 0); + | (nev & EV_WRITE ? EPOLLOUT : 0) + | (nev & EV_EXCEPTION ? EPOLLPRI : 0); if (expect_true (!epoll_ctl (backend_fd, oev && oldmask != nev ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, fd, &ev))) return; @@ -168,7 +169,8 @@ epoll_poll (EV_P_ ev_tstamp timeout) int fd = (uint32_t)ev->data.u64; /* mask out the lower 32 bits */ int want = anfds [fd].events; int got = (ev->events & (EPOLLOUT | EPOLLERR | EPOLLHUP) ? EV_WRITE : 0) - | (ev->events & (EPOLLIN | EPOLLERR | EPOLLHUP) ? EV_READ : 0); + | (ev->events & (EPOLLIN | EPOLLERR | EPOLLHUP) ? EV_READ : 0) + | (ev->events & (EPOLLPRI | EPOLLERR | EPOLLHUP) ? EV_EXCEPTION : 0); /* * check for spurious notification. @@ -197,7 +199,8 @@ epoll_poll (EV_P_ ev_tstamp timeout) * but we closed it). */ ev->events = (want & EV_READ ? EPOLLIN : 0) - | (want & EV_WRITE ? EPOLLOUT : 0); + | (want & EV_WRITE ? EPOLLOUT : 0) + | (want & EV_EXCEPTION ? EPOLLPRI : 0); /* pre-2.6.9 kernels require a non-null pointer with EPOLL_CTL_DEL, */ /* which is fortunately easy to do for us. */ -- 2.39.2