jabberd2  2.2.17
mio_epoll.h
Go to the documentation of this file.
1 /*
2  * jabberd - Jabber Open Source Server
3  * Copyright (c) 2002 Jeremie Miller, Thomas Muldowney,
4  * Ryan Eatmon, Robert Norris, Christof Meerwald
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307USA
19  */
20 
21 /* MIO backend for epoll() */
22 
23 #include <sys/epoll.h>
24 
25 #define MIO_FUNCS \
26  static int _mio_poll(mio_t m, int t) \
27  { \
28  return epoll_wait(MIO(m)->epoll_fd, \
29  MIO(m)->res_event, 32, t*1000); \
30  } \
31  \
32  static mio_fd_t _mio_alloc_fd(mio_t m, int fd) \
33  { \
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)); \
37  \
38  priv_fd->mio_fd.fd = fd; \
39  priv_fd->events = 0; \
40  \
41  event.events = priv_fd->events; \
42  event.data.u64 = 0; \
43  event.data.ptr = priv_fd; \
44  epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_ADD, fd, &event); \
45  \
46  return (mio_fd_t)priv_fd; \
47  }
48 
49 
50 #define MIO_FD_VARS \
51  uint32_t events;
52 
53 #define MIO_VARS \
54  int defer_free; \
55  int epoll_fd; \
56  struct epoll_event res_event[32];
57 
58 #define MIO_INIT_VARS(m) \
59  do { \
60  MIO(m)->defer_free = 0; \
61  if ((MIO(m)->epoll_fd = epoll_create(maxfd)) < 0) \
62  { \
63  mio_debug(ZONE,"unable to initialize epoll mio"); \
64  free(m); \
65  return NULL; \
66  } \
67  } while(0)
68 #define MIO_FREE_VARS(m) \
69  do { \
70  close(MIO(m)->epoll_fd); \
71  } while(0)
72 
73 
74 #define MIO_ALLOC_FD(m, rfd) _mio_alloc_fd(m, rfd)
75 #define MIO_FREE_FD(m, mfd) if(mfd)free(mfd)
76 
77 #define MIO_REMOVE_FD(m, mfd) \
78  do { \
79  struct epoll_event event; \
80  event.events = 0; \
81  event.data.u64 = 0; \
82  event.data.ptr = mfd; \
83  epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_DEL, \
84  mfd->mio_fd.fd, &event); \
85  } while (0)
86 
87 #define MIO_CHECK(m, t) _mio_poll(m, t)
88 
89 #define MIO_SET_READ(m, mfd) \
90  do { \
91  struct epoll_event event; \
92  mfd->events |= EPOLLIN; \
93  event.events = mfd->events; \
94  event.data.u64 = 0; \
95  event.data.ptr = mfd; \
96  epoll_ctl(MIO(m)->epoll_fd, EPOLL_CTL_MOD, \
97  mfd->mio_fd.fd, &event); \
98  } while (0)
99 
100 #define MIO_SET_WRITE(m, mfd) \
101  do { \
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); \
109  } while (0)
110 
111 #define MIO_UNSET_READ(m, mfd) \
112  do { \
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); \
120  } while (0)
121 #define MIO_UNSET_WRITE(m, mfd) \
122  do { \
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); \
130  } while (0)
131 
132 
133 #define MIO_CAN_READ(m,iter) \
134  (MIO(m)->res_event[iter].events & (EPOLLIN|EPOLLERR|EPOLLHUP))
135 
136 #define MIO_CAN_WRITE(m,iter) \
137  (MIO(m)->res_event[iter].events & EPOLLOUT)
138 
139 #define MIO_CAN_FREE(m) (!MIO(m)->defer_free)
140 
141 #define MIO_INIT_ITERATOR(iter) \
142  int iter
143 
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++)
146 
147 #define MIO_ITERATOR_FD(m, iter) \
148  (MIO(m)->res_event[iter].data.ptr)