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"); \
68 #define MIO_FREE_VARS(m) \
70 close(MIO(m)->epoll_fd); \
74 #define MIO_ALLOC_FD(m, rfd) _mio_alloc_fd(m, rfd)
75 #define MIO_FREE_FD(m, mfd) if(mfd)free(mfd)
77 #define MIO_REMOVE_FD(m, mfd) \
79 struct epoll_event event; \
82 event.data.ptr = mfd; \
83 epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_DEL, \
84 mfd->mio_fd.fd, &event); \
87 #define MIO_CHECK(m, t) _mio_poll(m, t)
89 #define MIO_SET_READ(m, mfd) \
91 struct epoll_event event; \
92 mfd->events |= EPOLLIN; \
93 event.events = mfd->events; \
95 event.data.ptr = mfd; \
96 epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_MOD, \
97 mfd->mio_fd.fd, &event); \
100 #define MIO_SET_WRITE(m, mfd) \
102 struct epoll_event event; \
103 mfd->events |= EPOLLOUT; \
104 event.events = mfd->events; \
105 event.data.u64 = 0; \
106 event.data.ptr = mfd; \
107 epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_MOD, \
108 mfd->mio_fd.fd, &event); \
111 #define MIO_UNSET_READ(m, mfd) \
113 struct epoll_event event; \
114 mfd->events &= ~EPOLLIN; \
115 event.events = mfd->events; \
116 event.data.u64 = 0; \
117 event.data.ptr = mfd; \
118 epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_MOD, \
119 mfd->mio_fd.fd, &event); \
121 #define MIO_UNSET_WRITE(m, mfd) \
123 struct epoll_event event; \
124 mfd->events &= ~(EPOLLOUT); \
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); \
133 #define MIO_CAN_READ(m,iter) \
134 (MIO(m)->res_event[iter].events & (EPOLLIN|EPOLLERR|EPOLLHUP))
136 #define MIO_CAN_WRITE(m,iter) \
137 (MIO(m)->res_event[iter].events & EPOLLOUT)
139 #define MIO_CAN_FREE(m) (!MIO(m)->defer_free)
141 #define MIO_INIT_ITERATOR(iter) \
144 #define MIO_ITERATE_RESULTS(m, retval, iter) \
145 for(MIO(m)->defer_free = 1, iter = 0; (iter < retval) || ((MIO(m)->defer_free = 0)); iter++)
147 #define MIO_ITERATOR_FD(m, iter) \
148 (MIO(m)->res_event[iter].data.ptr)