2 #define epoll_fill int i = epoll_wait(ep, event, 1, 5); \
5 log(DEBUG,"epoll_wait call: ep=%d, i=%d",ep,i); \
6 userrec* cu = fd_ref_table[event[0].data.fd];
8 #define kqueue_fill ts.tv_sec = 0; \
10 int i = kevent(kq, NULL, 0, &ke, 1, &ts); \
13 log(DEBUG,"kevent call: kq=%d, i=%d",kq,i); \
14 userrec* cu = fd_ref_table[ke.ident];
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++) \
22 if (count2a == clientlist.end()) \
24 userrec* cu = count2a->second;
27 #define engine_fill epoll_fill
30 #define engine_fill kqueue_fill
33 #define engine_fill select_fill
36 #define epoll_check ((cu->fd != FD_MAGIC_NUMBER) && (cu->fd != -1))
38 #define kqueue_check ((cu->fd != FD_MAGIC_NUMBER) && (cu->fd != -1))
40 #define select_check ((cu->fd != FD_MAGIC_NUMBER) && (cu->fd != -1) && (FD_ISSET (cu->fd, &sfd)))
43 #define engine_check epoll_check
46 #define engine_check kqueue_check
49 #define engine_check select_check
52 #define epoll_cleanup log(DEBUG,"InspIRCd: Exited: %s",cu->nick); \
53 kill_link(cu,"Client exited"); \
54 log(DEBUG,"Bailing from client exit"); \
57 #define kqueue_cleanup log(DEBUG,"InspIRCd: Exited: %s",cu->nick); \
58 kill_link(cu,"Client exited"); \
59 log(DEBUG,"Bailing from client exit"); \
62 #define select_cleanup if (count2->second) \
64 log(DEBUG,"InspIRCd: Exited: %s",cu->nick); \
65 kill_link(cu,"Client exited"); \
66 log(DEBUG,"Bailing from client exit"); \
71 #define engine_cleanup epoll_cleanup
74 #define engine_cleanup kqueue_cleanup
77 #define engine_cleanup select_cleanup
81 #define select_scanset for (count = 0; count < boundPortCount; count++) \
83 FD_SET (openSockfd[count], &selectFds); \
85 tv.tv_usec = 30000L; \
86 selectResult = select(MAXSOCKS, &selectFds, NULL, NULL, &tv); \
87 if (selectResult > 0) \
89 for (count = 0; count < boundPortCount; count++) \
91 if (FD_ISSET (openSockfd[count], &selectFds)) \
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++) \
99 log(DEBUG,"kqueue: Listening socket event, i=%d, ke.ident=%d",i,ke_list[j].ident); \
100 for (count = 0; count < boundPortCount; count++) \
102 if ((unsigned)ke_list[j].ident == (unsigned)openSockfd[count]) \
105 #define epoll_scanset i = epoll_wait(lep, event, 32, EP_DELAY); \
106 if (i > 0) for (j = 0; j < i; j++) \
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++) \
111 if ((unsigned)event[j].data.fd == (unsigned)openSockfd[count]) \
115 #define engine_scanset epoll_scanset
118 #define engine_scanset kqueue_scanset
121 #define engine_scanset select_scanset
124 #define epoll_server_populate i = epoll_wait(sep, event, 1, EP_DELAY); \
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++) \
130 if ((me[x]) && ((unsigned)event[0].data.fd == (unsigned)me[x]->fd)) \
132 #define kqueue_server_populate ts.tv_sec = 0; \
133 ts.tv_nsec = 30000L; \
134 i = kevent(skq, NULL, 0, &ke, 1, &ts); \
137 log(DEBUG,"kqueue: Listening server socket event, i=%d, ke.ident=%d",i,ke.ident); \
138 for (int x = 0; x != SERVERportCount; x++) \
140 if ((me[x]) && ((unsigned)ke.ident == (unsigned)me[x]->fd)) \
143 #define select_server_populate FD_ZERO(&serverfds); \
144 for (int x = 0; x != SERVERportCount; x++) \
147 FD_SET(me[x]->fd, &serverfds); \
149 tvs.tv_usec = 30000L; \
151 int servresult = select(FD_SETSIZE, &serverfds, NULL, NULL, &tvs); \
152 if (servresult > 0) \
154 for (int x = 0; x != SERVERportCount; x++) \
156 if ((me[x]) && (FD_ISSET (me[x]->fd, &serverfds))) \
161 #define engine_server_populate epoll_server_populate
164 #define engine_server_populate kqueue_server_populate
167 #define engine_server_populate select_server_populate
170 #define kqueue_structs struct kevent ke; \
171 struct kevent ke_list[33]; \
174 #define epoll_structs struct epoll_event event[33];
176 #define select_structs fd_set serverfds; \
180 #define engine_structs epoll_structs
183 #define engine_structs kqueue_structs
186 #define engine_structs select_structs
189 #define select_init while(0);
191 #define kqueue_init kq = kqueue(); \
194 if ((kq == -1) || (lkq == -1) || (skq == -1)) \
196 log(DEFAULT,"main: kqueue() failed!"); \
197 printf("ERROR: could not initialise kqueue event system. Shutting down.\n"); \
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)) \
206 log(DEFAULT,"main: epoll_create() failed!"); \
207 printf("ERROR: could not initialise epoll event system. Shutting down.\n"); \
213 #define engine_init epoll_init
216 #define engine_init kqueue_init
219 #define engine_init select_init
222 #define select_server_fill log(DEFAULT,"Using standard select socket engine.");
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++) \
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); \
234 log(DEFAULT,"main: add listen ports, epoll_ctl failed!"); \
235 printf("ERROR: could not initialise listening sockets in epoll list. Shutting down.\n"); \
239 for (int t = 0; t != SERVERportCount; t++) \
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); \
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"); \
254 #define kqueue_server_fill log(DEFAULT,"kqueue socket engine is enabled. Filling listen list."); \
255 for (count = 0; count < boundPortCount; count++) \
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); \
263 log(DEFAULT,"main: add listen ports to kqueue failed!"); \
264 printf("ERROR: could not initialise listening sockets in kqueue. Shutting down.\n"); \
268 for (int t = 0; t != SERVERportCount; t++) \
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); \
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"); \
286 #define engine_server_fill epoll_server_fill
289 #define engine_server_fill kqueue_server_fill
292 #define engine_server_fill select_server_fill
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); \
301 log(DEBUG,"kqueue: Failed to remove user from queue!"); \
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); \
310 log(DEBUG,"epoll: List deletion failure!"); \
313 #define select_delete_fd while(0);
317 #define engine_delete_fd epoll_delete_fd
320 #define engine_delete_fd kqueue_delete_fd
323 #define engine_delete_fd select_delete_fd
326 #define select_add_fd while(0);
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); \
335 log(DEBUG,"epoll: List insertion failure!"); \
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); \
344 log(DEBUG,"kqueue: List insertion failure!"); \
348 #define engine_add_fd epoll_add_fd
351 #define engine_add_fd kqueue_add_fd
354 #define engine_add_fd select_add_fd
358 #define engine_name "kqueue"
361 #define engine_name "select"
364 #define engine_name "epoll"