Go to the documentation of this file.
3 #ifdef HAVE_SYS_TYPES_H
6 #ifdef HAVE_SYS_EVENT_H
15 mio_priv_t dbjdebug; \
17 _mio_alloc_fd(mio_t m, int fd) \
19 struct kevent events[2]; \
20 mio_priv_fd_t priv_fd; \
22 priv_fd = malloc(sizeof(*priv_fd)); \
23 memset(priv_fd, 0, sizeof(*priv_fd)); \
24 priv_fd->mio_fd.fd = fd; \
25 EV_SET(&events[0], fd, EVFILT_READ, EV_ADD|EV_DISABLE, 0, 0, priv_fd); \
26 EV_SET(&events[1], fd, EVFILT_WRITE, EV_ADD|EV_DISABLE, 0, 0, priv_fd); \
27 if (kevent(MIO(m)->kq, events, sizeof(events)/sizeof(events[0]), NULL, 0, NULL) == -1) { \
28 mio_debug(ZONE,"error creating kevents on fd %d (%d)", fd, errno); \
30 return (mio_fd_t)priv_fd; \
34 _mio_free_fd(mio_t m, mio_fd_t mfd) \
44 for (i = 0; i < MIO(m)->nevents; i++) { \
45 if (MIO(m)->events[i].udata == mfd) { \
46 MIO(m)->events[i].udata = &MIO(m)->dummy; \
49 memset(mfd, 0x5a, sizeof(mio_priv_fd_t)); \
54 _mio_check(mio_t m, int timeout) \
59 ts.tv_sec = timeout; \
60 ret = kevent(MIO(m)->kq, NULL, 0, MIO(m)->events, sizeof(MIO(m)->events)/sizeof(MIO(m)->events[0]), &ts); \
62 MIO(m)->nevents = ret; \
71 struct kevent events[32]; \
72 struct mio_priv_fd_st dummy;
74 #define MIO_INIT_VARS(m) \
76 MIO(m)->nevents = 0; \
77 MIO(m)->dummy.type = type_CLOSED; \
78 if ((MIO(m)->kq = kqueue()) == -1) { \
79 mio_debug(ZONE,"internal error creating kqueue (%d)", errno); \
84 #define MIO_FREE_VARS(m) close(MIO(m)->kq)
86 #define MIO_ALLOC_FD(m, rfd) _mio_alloc_fd(m,rfd)
87 #define MIO_CAN_FREE(m) (MIO(m)->nevents == 0)
88 #define MIO_FREE_FD(m, mfd) _mio_free_fd(m, mfd)
90 #define MIO_REMOVE_FD(m, mfd) \
92 struct kevent events[2]; \
93 EV_SET(&events[0], mfd->mio_fd.fd, EVFILT_READ, EV_DELETE, 0, 0, mfd); \
94 EV_SET(&events[1], mfd->mio_fd.fd, EVFILT_WRITE, EV_DELETE, 0, 0, mfd); \
95 if (kevent(MIO(m)->kq, events, sizeof(events)/sizeof(events[0]), NULL, 0, NULL) == -1) { \
96 mio_debug(ZONE,"error deleting kevents on fd %d (%d)", mfd->mio_fd.fd, errno); \
104 #define MIO_SET_READ(m, mfd) \
106 struct kevent changelist; \
107 EV_SET(&changelist, mfd->mio_fd.fd, EVFILT_READ, EV_ENABLE, 0, 0, mfd); \
108 if (kevent(MIO(m)->kq, &changelist, 1, NULL, 0, NULL) == -1) { \
109 mio_debug(ZONE,"error setting kevent EVFILT_READ on fd %d (%d)", mfd->mio_fd.fd, errno); \
113 #define MIO_SET_WRITE(m, mfd) \
115 struct kevent changelist; \
116 EV_SET(&changelist, mfd->mio_fd.fd, EVFILT_WRITE, EV_ENABLE, 0, 0, mfd); \
117 if (kevent(MIO(m)->kq, &changelist, 1, NULL, 0, NULL) == -1) { \
118 mio_debug(ZONE,"error setting kevent EVFILT_WRITE on fd %d (%d)", mfd->mio_fd.fd, errno); \
122 #define MIO_UNSET_READ(m, mfd) \
124 struct kevent changelist; \
125 EV_SET(&changelist, mfd->mio_fd.fd, EVFILT_READ, EV_DISABLE, 0, 0, mfd); \
126 if (kevent(MIO(m)->kq, &changelist, 1, NULL, 0, NULL) == -1) { \
127 mio_debug(ZONE,"error setting kevent EVFILT_READ on fd %d (%d)", mfd->mio_fd.fd, errno); \
131 #define MIO_UNSET_WRITE(m, mfd) \
133 struct kevent changelist; \
134 EV_SET(&changelist, mfd->mio_fd.fd, EVFILT_WRITE, EV_DISABLE, 0, 0, mfd); \
135 if (kevent(MIO(m)->kq, &changelist, 1, NULL, 0, NULL) == -1) { \
136 mio_debug(ZONE,"error setting kevent EVFILT_WRITE on fd %d (%d)", mfd->mio_fd.fd, errno); \
140 #define MIO_INIT_ITERATOR(iter) \
143 #define MIO_ITERATE_RESULTS(m, retval, iter) \
144 for(iter = 0; (iter < retval) || ((MIO(m)->nevents = 0)); iter++)
146 #define MIO_CAN_READ(m, iter) (MIO((m))->events[(iter)].filter == EVFILT_READ)
147 #define MIO_CAN_WRITE(m, iter) (MIO((m))->events[(iter)].filter == EVFILT_WRITE)
149 #define MIO_ITERATOR_FD(m, iter) ((mio_fd_t)(MIO(m)->events[(iter)].udata))
151 #define MIO_CHECK(m, t) _mio_check(m, t)