X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=server.h;h=271732b55e5a848a232c73fd967cefa4fa26448c;hp=f1cc7a0dbfc0d56116739ebccda95829d8cfe577;hb=4971ba0e48d77b075fc972c13ec2978aa93630a1;hpb=eb33692c9edee93e0883cd9f980d48dc7e17d801 diff --git a/server.h b/server.h index f1cc7a0..271732b 100644 --- a/server.h +++ b/server.h @@ -63,15 +63,6 @@ public: void add_data(const std::string &stream_id, const char *data, size_t bytes); private: - void process_client(Client *client); - - // Close a given client socket, and clean up after it. - void close_client(Client *client); - - // Parse the HTTP request, construct the header, and set the client into - // the SENDING_HEADER state. - void parse_request(Client *client); - pthread_mutex_t mutex; // Map from stream ID to stream. @@ -84,11 +75,33 @@ private: int epoll_fd; epoll_event events[EPOLL_MAX_EVENTS]; + // Clients that are in SENDING_DATA, but that we don't listen on, + // because we currently don't have any data for them. + // See put_client_to_sleep() and wake_up_all_clients(). + std::vector sleeping_clients; + // Recover the this pointer, and call do_work(). static void *do_work_thunk(void *arg); // The actual worker thread. void do_work(); + + void process_client(Client *client); + + // Close a given client socket, and clean up after it. + void close_client(Client *client); + + // Parse the HTTP request, construct the header, and set the client into + // the SENDING_HEADER state. + void parse_request(Client *client); + + // Put client to sleep, since there is no more data for it; we will on + // longer listen on POLLOUT until we get more data. Also, it will be put + // in the list of clients to wake up when we do. + void put_client_to_sleep(Client *client); + + // We have more data, so mark all clients that are sleeping as ready to go. + void wake_up_all_clients(); }; #endif // !defined(_SERVER_H)