From d9de2a370c08fd6738984e759a1ab4f91015af0c Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sun, 7 Apr 2013 23:26:37 +0200 Subject: [PATCH] Fix so clients would actually be woken up from the worker thread, not the input thread. (Gah!) --- server.cpp | 16 +++++++++++----- server.h | 4 ++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/server.cpp b/server.cpp index eeab64b..d41e3c7 100644 --- a/server.cpp +++ b/server.cpp @@ -162,7 +162,7 @@ void Server::do_work() if (should_stop) { return; } - + for (int i = 0; i < nfds; ++i) { int fd = events[i].data.fd; assert(clients.count(fd) != 0); @@ -175,6 +175,11 @@ void Server::do_work() process_client(client); } + + for (unsigned i = 0; i < to_process.size(); ++i) { + process_client(to_process[i]); + } + to_process.clear(); } } @@ -579,10 +584,11 @@ void Server::put_client_to_sleep(Client *client) void Server::wake_up_all_clients() { - vector to_process; - swap(sleeping_clients, to_process); - for (unsigned i = 0; i < to_process.size(); ++i) { - process_client(to_process[i]); + if (to_process.empty()) { + swap(sleeping_clients, to_process); + } else { + to_process.insert(to_process.end(), sleeping_clients.begin(), sleeping_clients.end()); + sleeping_clients.clear(); } } diff --git a/server.h b/server.h index fd309f4..6e0dd9d 100644 --- a/server.h +++ b/server.h @@ -124,6 +124,10 @@ private: // See put_client_to_sleep() and wake_up_all_clients(). std::vector sleeping_clients; + // Clients that we recently got data for (when they were in + // ). + std::vector to_process; + // Recover the this pointer, and call do_work(). static void *do_work_thunk(void *arg); -- 2.39.2