tvhpoll: corrected some mistakes and expanded usage for user data.
This commit is contained in:
parent
a2ef8e9c94
commit
7d122d8dea
2 changed files with 26 additions and 14 deletions
|
@ -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
|
||||
|
|
|
@ -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__ */
|
||||
|
|
Loading…
Add table
Reference in a new issue