static ALWAYS_INLINE enum herd_accept accept_one(struct lwan *l, uint64_t *cores) { int fd = accept4((int)main_socket, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC); if (LIKELY(fd >= 0)) { *cores |= UINT64_C(1)<<schedule_client(l, fd); return HERD_MORE; } switch (errno) { case EAGAIN: return HERD_GONE; case EBADF: case ECONNABORTED: case EINVAL: if (main_socket < 0) { lwan_status_info("Signal 2 (Interrupt) received"); } else { lwan_status_info("Main socket closed for unknown reasons"); } return HERD_SHUTDOWN; default: lwan_status_perror("accept"); return HERD_MORE; } }
void lwan_main_loop(lwan_t *l) { assert(main_socket == -1); main_socket = l->main_socket; if (signal(SIGINT, sigint_handler) == SIG_ERR) lwan_status_critical("Could not set signal handler"); lwan_status_info("Ready to serve"); for (;;) { int client_fd = accept4((int)main_socket, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC); if (UNLIKELY(client_fd < 0)) { switch (errno) { case EBADF: case ECONNABORTED: if (main_socket < 0) { lwan_status_info("Signal 2 (Interrupt) received"); } else { lwan_status_info("Main socket closed for unknown reasons"); } return; } lwan_status_perror("accept"); } else { schedule_client(l, client_fd); } } }
void lwan_main_loop(lwan_t *l) { assert(main_socket == -1); main_socket = l->main_socket; if (signal(SIGINT, sigint_handler) == SIG_ERR) lwan_status_critical("Could not set signal handler"); lwan_status_info("Ready to serve"); for (;;) { int client_fd = accept4(main_socket, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC); if (UNLIKELY(client_fd < 0)) { if (errno != EBADF) { lwan_status_perror("accept"); continue; } if (main_socket < 0) { lwan_status_info("Signal 2 (Interrupt) received"); } else { lwan_status_info("Main socket closed for unknown reasons"); } break; } schedule_client(l, client_fd); } }
static bool wait_herd(void) { struct pollfd fds = { .fd = (int)main_socket, .events = POLLIN }; return poll(&fds, 1, -1) == 1; } enum herd_accept { HERD_MORE = 0, HERD_GONE = -1, HERD_SHUTDOWN = 1 }; static enum herd_accept accept_one(struct lwan *l, uint64_t *cores) { int fd = accept4((int)main_socket, NULL, NULL, SOCK_NONBLOCK | SOCK_CLOEXEC); if (LIKELY(fd >= 0)) { *cores |= 1ULL<<(unsigned)schedule_client(l, fd); return HERD_MORE; } switch (errno) { case EAGAIN: return HERD_GONE; case EBADF: case ECONNABORTED: case EINVAL: if (main_socket < 0) { lwan_status_info("Signal 2 (Interrupt) received"); } else { lwan_status_info("Main socket closed for unknown reasons"); } return HERD_SHUTDOWN; } lwan_status_perror("accept"); return HERD_MORE; }