#include "ircd_log.h"
#include "s_debug.h"
-#include <assert.h>
+/* #include <assert.h> -- Now using assert in ircd_log.h */
#include <errno.h>
#include <sys/types.h>
#ifdef HAVE_STDINT_H
/* Oh, did we mention that some glibc releases do not even define the
* syscall numbers? */
#if !defined(__NR_epoll_create)
-#if defined(__i386__)
-#define __NR_epoll_create 254
-#define __NR_epoll_ctl 255
-#define __NR_epoll_wait 256
-#elif defined(__ia64__)
+#if defined(__ia64__)
#define __NR_epoll_create 1243
#define __NR_epoll_ctl 1244
#define __NR_epoll_wait 1245
#define __NR_epoll_create 214
#define __NR_epoll_ctl 233
#define __NR_epoll_wait 232
+#elif defined(__sparc64__) || defined(__sparc__)
+#define __NR_epoll_create 193
+#define __NR_epoll_ctl 194
+#define __NR_epoll_wait 195
+#elif defined(__s390__) || defined(__m68k__)
+#define __NR_epoll_create 249
+#define __NR_epoll_ctl 250
+#define __NR_epoll_wait 251
+#elif defined(__ppc64__) || defined(__ppc__)
+#define __NR_epoll_create 236
+#define __NR_epoll_ctl 237
+#define __NR_epoll_wait 238
+#elif defined(__parisc__) || defined(__arm26__) || defined(__arm__)
+#define __NR_epoll_create 224
+#define __NR_epoll_ctl 225
+#define __NR_epoll_wait 226
+#elif defined(__alpha__)
+#define __NR_epoll_create 407
+#define __NR_epoll_ctl 408
+#define __NR_epoll_wait 409
+#elif defined(__sh64__)
+#define __NR_epoll_create 282
+#define __NR_epoll_ctl 283
+#define __NR_epoll_wait 284
+#elif defined(__i386__) || defined(__sh__) || defined(__m32r__) || defined(__h8300__) || defined(__frv__)
+#define __NR_epoll_create 254
+#define __NR_epoll_ctl 255
+#define __NR_epoll_wait 256
#else /* cpu types */
#error No system call numbers defined for epoll family.
#endif /* cpu types */
static void
engine_delete(struct Socket *sock)
{
- struct epoll_event evt;
-
assert(0 != sock);
- memset(&evt, 0, sizeof(evt));
Debug((DEBUG_ENGINE, "epoll: Deleting socket %d [%p], state %s",
s_fd(sock), sock, state_to_name(s_state(sock))));
- if (epoll_ctl(epoll_fd, EPOLL_CTL_DEL, s_fd(sock), &evt) < 0)
- log_write(LS_SOCKET, L_WARNING, 0,
- "Unable to delete epoll item for socket %d", s_fd(sock));
+ /* No action necessary; epoll removes the socket on close(). */
}
/** Run engine event loop.
{
struct epoll_event *events;
struct Socket *sock;
- size_t codesize;
+ socklen_t codesize;
int events_count, i, wait, nevs, errcode;
if ((events_count = feature_int(FEAT_POLLS_PER_LOOP)) < 20)
gen_ref_dec(sock);
continue;
}
- }
-
- switch (s_state(sock)) {
+ } else if (events[i].events & EPOLLHUP) {
+ event_generate(ET_EOF, sock, 0);
+ } else switch (s_state(sock)) {
case SS_CONNECTING:
if (events[i].events & EPOLLOUT) /* connection completed */
event_generate(ET_CONNECT, sock, 0);
case SS_NOTSOCK:
case SS_CONNECTED:
- if (events[i].events & EPOLLIN)
- event_generate((events[i].events & EPOLLHUP) ? ET_EOF : ET_READ, sock, 0);
- if (events[i].events & EPOLLOUT)
- event_generate(ET_WRITE, sock, 0);
- break;
-
case SS_DATAGRAM:
case SS_CONNECTDG:
if (events[i].events & EPOLLIN)
}
timer_run();
}
+ MyFree(events);
}
-/** Descriptor for dpoll event engine. */
+/** Descriptor for epoll event engine. */
struct Engine engine_epoll = {
"epoll()",
engine_init,