tvhpoll: corrected some mistakes and expanded usage for user data.

This commit is contained in:
Adam Sutton 2013-05-31 14:10:28 +01:00
parent a2ef8e9c94
commit 7d122d8dea
2 changed files with 26 additions and 14 deletions

View file

@ -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

View file

@ -18,22 +18,29 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __TVH_POLL_H__
#define __TVH_POLL_H_
#ifndef __TVHPOLL_H__
#define __TVHPOLL_H__
#include <sys/types.h>
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__ */