]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - include/socketengine.h
c99ffa5179a8cede60e3f3beb36b80e90da173a7
[user/henk/code/inspircd.git] / include / socketengine.h
1
2 #define epoll_fill      int i = epoll_wait(ep, event, 1, 5); \
3                         if (i > 0) \
4                         { \
5                                 log(DEBUG,"epoll_wait call: ep=%d, i=%d",ep,i); \
6                                 userrec* cu = fd_ref_table[event[0].data.fd];
7
8 #define kqueue_fill     ts.tv_sec = 0; \
9                         ts.tv_nsec = 1000L; \
10                         int i = kevent(kq, NULL, 0, &ke, 1, &ts); \
11                         if (i > 0) \
12                         { \
13                                 log(DEBUG,"kevent call: kq=%d, i=%d",kq,i); \
14                                 userrec* cu = fd_ref_table[ke.ident];
15
16 #define select_fill     tval.tv_sec = 0; \
17                         tval.tv_usec = 1000L; \
18                         selectResult2 = select(FD_SETSIZE, &sfd, NULL, NULL, &tval); \
19                         if ((selectResult2 > 0) && (xcount != clientlist.end())) \
20                         for (user_hash::iterator count2a = xcount; count2a != endingiter; count2a++) \
21                         { \
22                                 if (count2a == clientlist.end()) \
23                                         break; \
24                                 userrec* cu = count2a->second;
25
26 #ifdef USE_EPOLL
27 #define engine_fill epoll_fill
28 #endif
29 #ifdef USE_KQUEUE
30 #define engine_fill kqueue_fill
31 #endif
32 #ifdef USE_SELECT
33 #define engine_fill select_fill
34 #endif
35
36 #define epoll_check    ((cu->fd != FD_MAGIC_NUMBER) && (cu->fd != -1))
37
38 #define kqueue_check   ((cu->fd != FD_MAGIC_NUMBER) && (cu->fd != -1))
39
40 #define select_check   ((cu->fd != FD_MAGIC_NUMBER) && (cu->fd != -1) && (FD_ISSET (cu->fd, &sfd)))
41
42 #ifdef USE_EPOLL
43 #define engine_check epoll_check
44 #endif
45 #ifdef USE_KQUEUE
46 #define engine_check kqueue_check
47 #endif
48 #ifdef USE_SELECT
49 #define engine_check select_check
50 #endif
51
52 #define epoll_cleanup                   log(DEBUG,"InspIRCd: Exited: %s",cu->nick); \
53                                         kill_link(cu,"Client exited"); \
54                                         log(DEBUG,"Bailing from client exit"); \
55                                         goto label;
56
57 #define kqueue_cleanup                  log(DEBUG,"InspIRCd: Exited: %s",cu->nick); \
58                                         kill_link(cu,"Client exited"); \
59                                         log(DEBUG,"Bailing from client exit"); \
60                                         goto label;
61
62 #define select_cleanup                  if (count2->second) \
63                                         { \
64                                                 log(DEBUG,"InspIRCd: Exited: %s",cu->nick); \
65                                                 kill_link(cu,"Client exited"); \
66                                                 log(DEBUG,"Bailing from client exit"); \
67                                                 goto label; \
68                                         }
69
70 #ifdef USE_EPOLL
71 #define engine_cleanup epoll_cleanup
72 #endif
73 #ifdef USE_KQUEUE
74 #define engine_cleanup kqueue_cleanup
75 #endif
76 #ifdef USE_SELECT
77 #define engine_cleanup select_cleanup
78 #endif
79
80
81 #define select_scanset          for (count = 0; count < boundPortCount; count++) \
82                                 { \
83                                         FD_SET (openSockfd[count], &selectFds); \
84                                 } \
85                                 tv.tv_usec = 30000L; \
86                                 selectResult = select(MAXSOCKS, &selectFds, NULL, NULL, &tv); \
87                                 if (selectResult > 0) \
88                                 { \
89                                         for (count = 0; count < boundPortCount; count++) \
90                                 { \
91                                                 if (FD_ISSET (openSockfd[count], &selectFds)) \
92                                                 {
93
94 #define kqueue_scanset          ts.tv_sec = 0; \
95                                 ts.tv_nsec = 30000L; \
96                                 i = kevent(lkq, NULL, 0, ke_list, 32, &ts); \
97                                 if (i > 0) for (j = 0; j < i; j++) \
98                                 { \
99                                         log(DEBUG,"kqueue: Listening socket event, i=%d, ke.ident=%d",i,ke_list[j].ident); \
100                                         for (count = 0; count < boundPortCount; count++) \
101                                         { \
102                                                 if ((unsigned)ke_list[j].ident == (unsigned)openSockfd[count]) \
103                                                 {
104
105 #define epoll_scanset           i = epoll_wait(lep, event, 32, EP_DELAY); \
106                                 if (i > 0) for (j = 0; j < i; j++) \
107                                 { \
108                                         log(DEBUG,"epoll: Listening socket event, i=%d,events[j].data.fd=%d",i,event[j].data.fd); \
109                                         for (count = 0; count < boundPortCount; count++) \
110                                         { \
111                                                 if ((unsigned)event[j].data.fd == (unsigned)openSockfd[count]) \
112                                                 {
113
114 #ifdef USE_EPOLL
115 #define engine_scanset epoll_scanset
116 #endif
117 #ifdef USE_KQUEUE
118 #define engine_scanset kqueue_scanset
119 #endif
120 #ifdef USE_SELECT
121 #define engine_scanset select_scanset
122 #endif
123
124 #define epoll_server_populate               i = epoll_wait(sep, event, 1, EP_DELAY); \
125                                         if (i > 0) \
126                                         { \
127                                                 log(DEBUG,"epoll: Listening server socket event, i=%d, event.data.fd=%d",i,event[0].data.fd); \
128                                                 for (int x = 0; x != SERVERportCount; x++) \
129                                                 { \
130                                                         if ((me[x]) && ((unsigned)event[0].data.fd == (unsigned)me[x]->fd)) \
131                                                         {
132 #define kqueue_server_populate              ts.tv_sec = 0; \
133                                         ts.tv_nsec = 30000L; \
134                                         i = kevent(skq, NULL, 0, &ke, 1, &ts); \
135                                         if (i > 0) \
136                                         { \
137                                                 log(DEBUG,"kqueue: Listening server socket event, i=%d, ke.ident=%d",i,ke.ident); \
138                                                 for (int x = 0; x != SERVERportCount; x++) \
139                                                 { \
140                                                         if ((me[x]) && ((unsigned)ke.ident == (unsigned)me[x]->fd)) \
141                                                         {
142
143 #define select_server_populate              FD_ZERO(&serverfds); \
144                                         for (int x = 0; x != SERVERportCount; x++) \
145                                         { \
146                                                 if (me[x]) \
147                                                         FD_SET(me[x]->fd, &serverfds); \
148                                         } \
149                                         tvs.tv_usec = 30000L; \
150                                         tvs.tv_sec = 0; \
151                                         int servresult = select(FD_SETSIZE, &serverfds, NULL, NULL, &tvs); \
152                                         if (servresult > 0) \
153                                         { \
154                                                 for (int x = 0; x != SERVERportCount; x++) \
155                                                 { \
156                                                         if ((me[x]) && (FD_ISSET (me[x]->fd, &serverfds))) \
157                                                         { 
158
159
160 #ifdef USE_EPOLL
161 #define engine_server_populate epoll_server_populate
162 #endif
163 #ifdef USE_KQUEUE
164 #define engine_server_populate kqueue_server_populate
165 #endif
166 #ifdef USE_SELECT
167 #define engine_server_populate select_server_populate
168 #endif
169
170 #define kqueue_structs struct kevent ke; \
171         struct kevent ke_list[33]; \
172         struct timespec ts;
173
174 #define epoll_structs struct epoll_event event[33];
175
176 #define select_structs fd_set serverfds; \
177         fd_set sfd;
178
179 #ifdef USE_EPOLL
180 #define engine_structs epoll_structs
181 #endif
182 #ifdef USE_KQUEUE
183 #define engine_structs kqueue_structs
184 #endif
185 #ifdef USE_SELECT
186 #define engine_structs select_structs
187 #endif
188
189 #define select_init     while(0);
190
191 #define kqueue_init     kq = kqueue(); \
192                         lkq = kqueue(); \
193                         skq = kqueue(); \
194                         if ((kq == -1) || (lkq == -1) || (skq == -1)) \
195                         { \
196                                 log(DEFAULT,"main: kqueue() failed!"); \
197                                 printf("ERROR: could not initialise kqueue event system. Shutting down.\n"); \
198                                 Exit(ERROR); \
199                         }
200
201 #define epoll_init      ep = epoll_create(MAXCLIENTS); \
202                         lep = epoll_create(32); \
203                         sep = epoll_create(128); \
204                         if ((ep == -1) || (lep == -1) || (sep == -1)) \
205                         { \
206                                 log(DEFAULT,"main: epoll_create() failed!"); \
207                                 printf("ERROR: could not initialise epoll event system. Shutting down.\n"); \
208                                 Exit(ERROR); \
209                         }
210
211
212 #ifdef USE_EPOLL
213 #define engine_init epoll_init
214 #endif
215 #ifdef USE_KQUEUE
216 #define engine_init kqueue_init
217 #endif
218 #ifdef USE_SELECT
219 #define engine_init select_init
220 #endif
221
222 #define select_server_fill      log(DEFAULT,"Using standard select socket engine.");
223
224 #define epoll_server_fill        log(DEFAULT,"epoll socket engine is enabled. Filling listen list. boundPortcount=%d",boundPortCount); \
225                                 for (count = 0; count < boundPortCount; count++) \
226                                 { \
227                                         struct epoll_event ev; \
228                                         log(DEBUG,"epoll: Add listening socket to events, ep=%d socket=%d",lep,openSockfd[count]); \
229                                         ev.events = EPOLLIN | EPOLLET; \
230                                         ev.data.fd = openSockfd[count]; \
231                                         int i = epoll_ctl(lep, EPOLL_CTL_ADD, openSockfd[count], &ev); \
232                                         if (i < 0) \
233                                         { \
234                                                 log(DEFAULT,"main: add listen ports, epoll_ctl failed!"); \
235                                                 printf("ERROR: could not initialise listening sockets in epoll list. Shutting down.\n"); \
236                                                 Exit(ERROR); \
237                                         } \
238                                 } \
239                                 for (int t = 0; t != SERVERportCount; t++) \
240                                 { \
241                                         struct epoll_event ev; \
242                                         log(DEBUG,"epoll: Add listening server socket to events, ep=%d socket=%d",sep,me[t]->fd); \
243                                         ev.events = EPOLLIN | EPOLLET; \
244                                         ev.data.fd = me[t]->fd; \
245                                         int i = epoll_ctl(sep, EPOLL_CTL_ADD, me[t]->fd, &ev); \
246                                         if (i == -1) \
247                                         { \
248                                                 log(DEFAULT,"main: add server listen ports, epoll_ctl failed!"); \
249                                                 printf("ERROR: could not initialise server listening sockets in epoll list. Shutting down.\n"); \
250                                                 Exit(ERROR); \
251                                         } \
252                                 }
253
254 #define kqueue_server_fill        log(DEFAULT,"kqueue socket engine is enabled. Filling listen list."); \
255         for (count = 0; count < boundPortCount; count++) \
256         { \
257                 struct kevent ke; \
258                 log(DEBUG,"kqueue: Add listening socket to events, kq=%d socket=%d",lkq,openSockfd[count]); \
259                 EV_SET(&ke, openSockfd[count], EVFILT_READ, EV_ADD, 0, MaxConn, NULL); \
260                 int i = kevent(lkq, &ke, 1, 0, 0, NULL); \
261                 if (i == -1) \
262                 { \
263                         log(DEFAULT,"main: add listen ports to kqueue failed!"); \
264                         printf("ERROR: could not initialise listening sockets in kqueue. Shutting down.\n"); \
265                         Exit(ERROR); \
266                 } \
267         } \
268         for (int t = 0; t != SERVERportCount; t++) \
269         { \
270                 struct kevent ke; \
271                 if (me[t]) \
272                 { \
273                         log(DEBUG,"kqueue: Add listening SERVER socket to events, kq=%d socket=%d",skq,me[t]->fd); \
274                         EV_SET(&ke, me[t]->fd, EVFILT_READ, EV_ADD, 0, MaxConn, NULL); \
275                         int i = kevent(skq, &ke, 1, 0, 0, NULL); \
276                         if (i == -1) \
277                         { \
278                                 log(DEFAULT,"main: add server listen ports to kqueue failed!"); \
279                                 printf("ERROR: could not initialise listening server sockets in kqueue. Shutting down.\n"); \
280                                 Exit(ERROR); \
281                         } \
282                 } \
283         }
284
285 #ifdef USE_EPOLL
286 #define engine_server_fill epoll_server_fill
287 #endif
288 #ifdef USE_KQUEUE
289 #define engine_server_fill kqueue_server_fill
290 #endif
291 #ifdef USE_SELECT
292 #define engine_server_fill select_server_fill
293 #endif
294
295
296 #define kqueue_delete_fd        struct kevent ke; \
297                                 EV_SET(&ke, user->fd, EVFILT_READ, EV_DELETE, 0, 0, NULL); \
298                                 int i = kevent(kq, &ke, 1, 0, 0, NULL); \
299                                 if (i == -1) \
300                                 { \
301                                         log(DEBUG,"kqueue: Failed to remove user from queue!"); \
302                                 }
303
304 #define epoll_delete_fd         struct epoll_event ev; \
305                                 ev.events = EPOLLIN | EPOLLET; \
306                                 ev.data.fd = user->fd; \
307                                 int i = epoll_ctl(ep, EPOLL_CTL_DEL, user->fd, &ev); \
308                                 if (i < 0) \
309                                 { \
310                                         log(DEBUG,"epoll: List deletion failure!"); \
311                                 }
312
313 #define select_delete_fd        while(0);
314
315
316 #ifdef USE_EPOLL
317 #define engine_delete_fd epoll_delete_fd
318 #endif
319 #ifdef USE_KQUEUE
320 #define engine_delete_fd kqueue_delete_fd
321 #endif
322 #ifdef USE_SELECT
323 #define engine_delete_fd select_delete_fd
324 #endif
325
326 #define select_add_fd           while(0);
327
328 #define epoll_add_fd            struct epoll_event ev; \
329                                 log(DEBUG,"epoll: Adduser to events, ep=%d socket=%d",ep,socket); \
330                                 ev.events = EPOLLIN | EPOLLET; \
331                                 ev.data.fd = socket; \
332                                 int i = epoll_ctl(ep, EPOLL_CTL_ADD, socket, &ev); \
333                                 if (i < 0) \
334                                 { \
335                                         log(DEBUG,"epoll: List insertion failure!"); \
336                                 }
337
338 #define kqueue_add_fd           struct kevent ke; \
339                                 log(DEBUG,"kqueue: Add user to events, kq=%d socket=%d",kq,socket);\
340                                 EV_SET(&ke, socket, EVFILT_READ, EV_ADD, 0, 0, NULL); \
341                                 int i = kevent(kq, &ke, 1, 0, 0, NULL); \
342                                 if (i == -1) \
343                                 { \
344                                         log(DEBUG,"kqueue: List insertion failure!"); \
345                                 }
346
347 #ifdef USE_EPOLL
348 #define engine_add_fd epoll_add_fd
349 #endif
350 #ifdef USE_KQUEUE
351 #define engine_add_fd kqueue_add_fd
352 #endif
353 #ifdef USE_SELECT
354 #define engine_add_fd select_add_fd
355 #endif
356
357 #ifdef USE_KQUEUE
358 #define engine_name "kqueue"
359 #endif
360 #ifdef USE_SELECT
361 #define engine_name "select"
362 #endif
363 #ifdef USE_EPOLL
364 #define engine_name "epoll"
365 #endif
366