Go to the documentation of this file. 23 #include <sys/epoll.h> 26 static int _mio_poll(mio_t m, int t) \ 28 return epoll_wait(MIO(m)->epoll_fd, \ 29 MIO(m)->res_event, 32, t*1000); \ 32 static mio_fd_t _mio_alloc_fd(mio_t m, int fd) \ 34 struct epoll_event event; \ 35 mio_priv_fd_t priv_fd = malloc(sizeof (struct mio_priv_fd_st)); \ 36 memset(priv_fd, 0, sizeof (struct mio_priv_fd_st)); \ 38 priv_fd->mio_fd.fd = fd; \ 39 priv_fd->events = 0; \ 41 event.events = priv_fd->events; \ 43 event.data.ptr = priv_fd; \ 44 epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_ADD, fd, &event); \ 46 return (mio_fd_t)priv_fd; \ 56 struct epoll_event res_event[32]; 58 #define MIO_INIT_VARS(m) \ 60 MIO(m)->defer_free = 0; \ 61 if ((MIO(m)->epoll_fd = epoll_create(maxfd)) < 0) \ 63 mio_debug(ZONE,"unable to initialize epoll mio"); \ 69 #define MIO_FREE_VARS(m) \ 71 close(MIO(m)->epoll_fd); \ 75 #define MIO_ALLOC_FD(m, rfd) _mio_alloc_fd(m, rfd) 76 #define MIO_FREE_FD(m, mfd) if(mfd)free(mfd) 78 #define MIO_REMOVE_FD(m, mfd) \ 80 struct epoll_event event; \ 83 event.data.ptr = mfd; \ 84 epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_DEL, \ 85 mfd->mio_fd.fd, &event); \ 88 #define MIO_CHECK(m, t) _mio_poll(m, t) 90 #define MIO_SET_READ(m, mfd) \ 92 struct epoll_event event; \ 93 event.events = mfd->events; \ 94 mfd->events |= EPOLLIN; \ 95 if( mfd->events == event.events ) \ 97 event.events = mfd->events; \ 99 event.data.ptr = mfd; \ 100 epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_MOD, \ 101 mfd->mio_fd.fd, &event); \ 104 #define MIO_SET_WRITE(m, mfd) \ 106 struct epoll_event event; \ 107 event.events = mfd->events; \ 108 mfd->events |= EPOLLOUT; \ 109 if( mfd->events == event.events ) \ 111 event.events = mfd->events; \ 112 event.data.u64 = 0; \ 113 event.data.ptr = mfd; \ 114 epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_MOD, \ 115 mfd->mio_fd.fd, &event); \ 118 #define MIO_UNSET_READ(m, mfd) \ 120 struct epoll_event event; \ 121 event.events = mfd->events; \ 122 mfd->events &= ~EPOLLIN; \ 123 if( mfd->events == event.events ) \ 125 event.events = mfd->events; \ 126 event.data.u64 = 0; \ 127 event.data.ptr = mfd; \ 128 epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_MOD, \ 129 mfd->mio_fd.fd, &event); \ 132 #define MIO_UNSET_WRITE(m, mfd) \ 134 struct epoll_event event; \ 135 event.events = mfd->events; \ 136 mfd->events &= ~(EPOLLOUT); \ 137 if( mfd->events == event.events ) \ 139 event.events = mfd->events; \ 140 event.data.u64 = 0; \ 141 event.data.ptr = mfd; \ 142 epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_MOD, \ 143 mfd->mio_fd.fd, &event); \ 147 #define MIO_CAN_READ(m,iter) \ 148 (MIO(m)->res_event[iter].events & (EPOLLIN|EPOLLERR|EPOLLHUP)) 150 #define MIO_CAN_WRITE(m,iter) \ 151 (MIO(m)->res_event[iter].events & EPOLLOUT) 153 #define MIO_CAN_FREE(m) (!MIO(m)->defer_free) 155 #define MIO_INIT_ITERATOR(iter) \ 158 #define MIO_ITERATE_RESULTS(m, retval, iter) \ 159 for(MIO(m)->defer_free = 1, iter = 0; (iter < retval) || ((MIO(m)->defer_free = 0)); iter++) 161 #define MIO_ITERATOR_FD(m, iter) \ 162 (MIO(m)->res_event[iter].data.ptr)