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__ */