X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=acceptor.cpp;h=32a89fa7670d7221b54e7c98ffa0f8ce7e255abd;hp=70cd30c23bdfdcd53c16efe025c2ce4e58b01bdd;hb=74cd48ffef90d7d0752e37a4515e4ecfb68f7c9d;hpb=8cc780cf37063ce29f13380976a54dd8302fe3a9 diff --git a/acceptor.cpp b/acceptor.cpp index 70cd30c..32a89fa 100644 --- a/acceptor.cpp +++ b/acceptor.cpp @@ -1,23 +1,24 @@ #include #include #include +#include #include -#include #include #include #include #include +#include #include #include "acceptor.h" #include "log.h" #include "serverpool.h" #include "state.pb.h" +#include "util.h" using namespace std; extern ServerPool *servers; -extern volatile bool hupped; int create_server_socket(int port, SocketType socket_type) { @@ -94,32 +95,13 @@ AcceptorProto Acceptor::serialize() const void Acceptor::close_socket() { - int ret; - do { - ret = close(server_sock); - } while (ret == -1 && errno == EINTR); - - if (ret == -1) { - log_perror("close"); - } + safe_close(server_sock); } void Acceptor::do_work() { - while (!hupped) { - // Since we are non-blocking, we need to wait for the right state first. - // Wait up to 50 ms, then check hupped. - pollfd pfd; - pfd.fd = server_sock; - pfd.events = POLLIN; - - int nfds = poll(&pfd, 1, 50); - if (nfds == 0 || (nfds == -1 && errno == EINTR)) { - continue; - } - if (nfds == -1) { - log_perror("poll"); - usleep(100000); + while (!should_stop()) { + if (!wait_for_activity(server_sock, POLLIN, NULL)) { continue; } @@ -140,10 +122,18 @@ void Acceptor::do_work() // Set the socket as nonblocking. int one = 1; if (ioctl(sock, FIONBIO, &one) == -1) { - log_perror("FIONBIO"); + log_perror("ioctl(FIONBIO)"); exit(1); } + // Enable TCP_CORK for maximum throughput. In the rare case that the + // stream stops entirely, this will cause a small delay (~200 ms) + // before the last part is sent out, but that should be fine. + if (setsockopt(sock, SOL_TCP, TCP_CORK, &one, sizeof(one)) == -1) { + log_perror("setsockopt(TCP_CORK)"); + // Can still continue. + } + // Pick a server, round-robin, and hand over the socket to it. servers->add_client(sock); }