]> git.sesse.net Git - cubemap/blobdiff - server.cpp
If accept() fails, do not take down the entire thing; it could be a transient error...
[cubemap] / server.cpp
index 7cdfd1736f4f1aa98827c7674026d8eacddfd9f8..d41e3c70730b896e44a9362bf150ae534ee9f892 100644 (file)
@@ -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<Client *> 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();
        }
 }