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)