X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=server.cpp;h=b5f58d4c56711968db64a8d6c63e7d9eb08d0e25;hp=a0a32f8e704a716cad99563cd75b4bc47cfeb41b;hb=71fc5575037bead8b6e927a1fffd199e4fc4514b;hpb=ba03a3ed19cc8b02d4bb198edfd1c8bee9f28e35;ds=sidebyside diff --git a/server.cpp b/server.cpp index a0a32f8..b5f58d4 100644 --- a/server.cpp +++ b/server.cpp @@ -26,7 +26,6 @@ #include "server.h" #include "state.pb.h" #include "stream.h" -#include "util.h" using namespace std; @@ -52,7 +51,14 @@ Server::~Server() delete stream_it->second; } - safe_close(epoll_fd); + int ret; + do { + ret = close(epoll_fd); + } while (ret == -1 && errno == EINTR); + + if (ret == -1) { + log_perror("close(epoll_fd)"); + } } vector Server::get_client_stats() const @@ -70,11 +76,15 @@ vector Server::get_client_stats() const void Server::do_work() { - while (!should_stop()) { - // Wait until there's activity on at least one of the fds, - // or we are waken up due to new queued clients or data. - int nfds = epoll_pwait(epoll_fd, events, EPOLL_MAX_EVENTS, -1, &sigset_without_usr1_block); - if (nfds == -1 && errno != EINTR) { + for ( ;; ) { + int nfds = epoll_wait(epoll_fd, events, EPOLL_MAX_EVENTS, EPOLL_TIMEOUT_MS); + if (nfds == -1 && errno == EINTR) { + if (should_stop) { + return; + } + continue; + } + if (nfds == -1) { log_perror("epoll_wait"); exit(1); } @@ -103,6 +113,10 @@ void Server::do_work() process_client(to_process[i]); } } + + if (should_stop) { + return; + } } } @@ -129,7 +143,6 @@ void Server::add_client_deferred(int sock) { MutexLock lock(&queued_data_mutex); queued_add_clients.push_back(sock); - wakeup(); } void Server::add_client(int sock) @@ -246,7 +259,6 @@ void Server::add_data_deferred(const string &stream_id, const char *data, size_t { MutexLock lock(&queued_data_mutex); queued_data[stream_id].append(string(data, data + bytes)); - wakeup(); } // See the .h file for postconditions after this function. @@ -546,7 +558,14 @@ void Server::close_client(Client *client) access_log->write(client->get_stats()); // Bye-bye! - safe_close(client->sock); + int ret; + do { + ret = close(client->sock); + } while (ret == -1 && errno == EINTR); + + if (ret == -1) { + log_perror("close"); + } clients.erase(client->sock); }