From 7d122d8dea0bab3b6ee2c8eca1e94c85ed1e4fce Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Fri, 31 May 2013 14:10:28 +0100 Subject: [PATCH] tvhpoll: corrected some mistakes and expanded usage for user data. --- src/tvhpoll.c | 23 ++++++++++++++--------- src/tvhpoll.h | 17 ++++++++++++----- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/tvhpoll.c b/src/tvhpoll.c index cd985222..f40cfa8a 100644 --- a/src/tvhpoll.c +++ b/src/tvhpoll.c @@ -106,13 +106,16 @@ int tvhpoll_add struct epoll_event ev; for (i = 0; i < num; i++) { memset(&ev, 0, sizeof(ev)); - ev.data.fd = evs[i].fd; + ev.data.u64 = evs[i].data.u64; if (evs[i].events & TVHPOLL_IN) ev.events |= EPOLLIN; if (evs[i].events & TVHPOLL_OUT) ev.events |= EPOLLOUT; if (evs[i].events & TVHPOLL_PRI) ev.events |= EPOLLPRI; if (evs[i].events & TVHPOLL_ERR) ev.events |= EPOLLERR; - epoll_ctl(tp->fd, EPOLL_CTL_ADD, evs[i].fd, &ev); + if (evs[i].events & TVHPOLL_HUP) ev.events |= EPOLLHUP; + if (epoll_ctl(tp->fd, EPOLL_CTL_ADD, evs[i].fd, &ev) != 0) + return -1; } + return 0; #elif ENABLE_KQUEUE int i; uint32_t fflags; @@ -121,12 +124,11 @@ int tvhpoll_add fflags = 0; if (evs[i].events & TVHPOLL_OUT) fflags |= EVFILT_WRITE; if (evs[i].events & TVHPOLL_IN) fflags |= EVFILT_READ; - EV_SET(tp->ev+i, evs[i].fd, fflags, EV_ADD, 0, 0, NULL); + EV_SET(tp->ev+i, evs[i].fd, fflags, EV_ADD, 0, 0, evs[i].data.u64); } - kevent(tp->fd, tp->ev, num, NULL, 0, NULL); + return kevent(tp->fd, tp->ev, num, NULL, 0, NULL); #else #endif - return 0; } int tvhpoll_rem @@ -155,12 +157,13 @@ int tvhpoll_wait #if ENABLE_EPOLL nfds = epoll_wait(tp->fd, tp->ev, num, ms); for (i = 0; i < nfds; i++) { - evs[i].fd = tp->ev[i].data.fd; - evs[i].events = 0; + evs[i].data.u64 = tp->ev[i].data.u64; + evs[i].events = 0; if (tp->ev[i].events & EPOLLIN) evs[i].events |= TVHPOLL_IN; if (tp->ev[i].events & EPOLLOUT) evs[i].events |= TVHPOLL_OUT; if (tp->ev[i].events & EPOLLERR) evs[i].events |= TVHPOLL_ERR; if (tp->ev[i].events & EPOLLPRI) evs[i].events |= TVHPOLL_PRI; + if (tp->ev[i].events & EPOLLHUP) evs[i].events |= TVHPOLL_HUP; } #elif ENABLE_KQUEUE struct timespec tm, *to = NULL; @@ -171,10 +174,12 @@ int tvhpoll_wait } nfds = kevent(tp->fd, NULL, 0, tp->ev, num, to); for (i = 0; i < nfds; i++) { - evs[i].fd = tp->ev[i].ident; - evs[i].events = 0; + evs[i].fd = tp->ev[i].ident; + evs[i].events = 0; + evs[i].data.u64 = tp->ev[i].udata; if (tp->ev[i].fflags & EVFILT_WRITE) evs[i].events |= TVHPOLL_OUT; if (tp->ev[i].fflags & EVFILT_READ) evs[i].events |= TVHPOLL_IN; + if (tp->ev[i].flags & EV_EOF) evs[i].events |= TVHPOLL_HUP; } #else #endif diff --git a/src/tvhpoll.h b/src/tvhpoll.h index afdbfbc9..981b5c49 100644 --- a/src/tvhpoll.h +++ b/src/tvhpoll.h @@ -18,22 +18,29 @@ * along with this program. If not, see . */ -#ifndef __TVH_POLL_H__ -#define __TVH_POLL_H_ +#ifndef __TVHPOLL_H__ +#define __TVHPOLL_H__ #include typedef struct tvhpoll tvhpoll_t; typedef struct tvhpoll_event { - int fd; - int events; + int fd; // input + int events; + union { + void *ptr; + uint64_t u64; + uint32_t u32; + int fd; + } data; } tvhpoll_event_t; #define TVHPOLL_IN 0x01 #define TVHPOLL_OUT 0x02 #define TVHPOLL_PRI 0x04 #define TVHPOLL_ERR 0x08 +#define TVHPOLL_HUP 0x10 tvhpoll_t *tvhpoll_create ( size_t num ); void tvhpoll_destroy ( tvhpoll_t *tp ); @@ -44,4 +51,4 @@ int tvhpoll_rem int tvhpoll_wait ( tvhpoll_t *tp, tvhpoll_event_t *evs, size_t num, int ms ); -#endif /* __TVH_POLL_H__ */ +#endif /* __TVHPOLL_H__ */