static void *server_worker(void *arg) { struct request *req; while (1) { pthread_mutex_lock(&req_mutex); while (STAILQ_EMPTY(&requestq)) { pthread_cond_wait(&req_cond, &req_mutex); } req = STAILQ_FIRST(&requestq); STAILQ_REMOVE_HEAD(&requestq, link); pthread_mutex_unlock(&req_mutex); server_process_request(req); } return NULL; }
int32_t server_do(server_p srv) { fd_set fdset; int32_t n, fd; assert(srv != NULL); /* Copy cached version of the fd set and call select */ memcpy(&fdset, &srv->fdset, sizeof(fdset)); n = select(srv->maxfd + 1, &fdset, NULL, NULL, NULL); if (n < 0) { if (errno == EINTR) return (0); log_err("Could not select(%d, %p). %s (%d)", srv->maxfd + 1, &fdset, strerror(errno), errno); return (-1); } /* Process descriptors */ for (fd = 0; fd < srv->maxfd + 1 && n > 0; fd ++) { if (!FD_ISSET(fd, &fdset)) continue; assert(srv->fdidx[fd].valid); n --; if (srv->fdidx[fd].server) server_accept_client(srv, fd); else if (server_process_request(srv, fd) != 0) server_close_fd(srv, fd); } return (0); }
/* * Do one server iteration */ bool server_do(server_t *srv) { fd_set fdset; int n, fd; assert(srv != NULL); memcpy(&fdset, &srv->fdset, sizeof(fdset)); n = select(srv->fdmax + 1, &fdset, NULL, NULL, NULL); if (n == -1) { if (errno == EINTR) return true; log_err("Could not select(%d, %p). %s (%d)", srv->fdmax + 1, &fdset, strerror(errno), errno); return false; } for (fd = 0; fd < srv->fdmax + 1 && n > 0; fd++) { if (!FD_ISSET(fd, &fdset)) continue; assert(srv->fdidx[fd].valid); if (srv->fdidx[fd].server) server_accept_client(srv, fd); else if (!server_process_request(srv, fd)) server_close_fd(srv, fd); n--; } return true; }