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)