X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=server.cpp;h=d41e3c70730b896e44a9362bf150ae534ee9f892;hp=7cdfd1736f4f1aa98827c7674026d8eacddfd9f8;hb=d9de2a370c08fd6738984e759a1ab4f91015af0c;hpb=a54668ae3e87aade61b856ff6f088da471200bc6 diff --git a/server.cpp b/server.cpp index 7cdfd17..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(); } } @@ -217,6 +222,7 @@ void Server::add_client_from_serialized(const ClientProto &client) MutexLock lock(&mutex); Stream *stream = find_stream(client.stream_id()); clients.insert(make_pair(client.sock(), Client(client, stream))); + Client *client_ptr = &clients[client.sock()]; // Start listening on data from this socket. epoll_event ev; @@ -234,7 +240,12 @@ void Server::add_client_from_serialized(const ClientProto &client) exit(1); } - process_client(&clients[client.sock()]); + if (client_ptr->state == Client::SENDING_DATA && + client_ptr->bytes_sent == client_ptr->stream->data_size) { + put_client_to_sleep(client_ptr); + } else { + process_client(client_ptr); + } } void Server::add_stream(const string &stream_id) @@ -573,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(); } }