X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=server.h;h=dea24d894e4cf9e5c9ea5ab7d3e96fa77f861a08;hp=d8b9064f492f2ad12e333747b389bd1093b2564a;hb=5f72b6466cca4da0b8de29f4526a6cde23c5368e;hpb=97bdb597d4847308ce9d6982505b56a3a09e930b diff --git a/server.h b/server.h index d8b9064..dea24d8 100644 --- a/server.h +++ b/server.h @@ -6,21 +6,31 @@ #include #include +#define NUM_SERVERS 4 #define BACKLOG_SIZE 1048576 +#define EPOLL_MAX_EVENTS 8192 +#define EPOLL_TIMEOUT_MS 20 +#define MAX_CLIENT_REQUEST 16384 struct Client { + // The file descriptor associated with this socket. + int sock; + enum State { READING_REQUEST, SENDING_HEADER, SENDING_DATA }; State state; // The HTTP request, as sent by the client. If we are in READING_REQUEST, // this might not be finished. - std::string client_request; + std::string request; -#if 0 - // What stream we're connecting to; parsed from client_request. + // What stream we're connecting to; parsed from . // Not relevant for READING_REQUEST. - string stream_id; -#endif + std::string stream_id; + + // The header we want to send. This is nominally a copy of Stream::header, + // but since that might change on reconnects etc., we keep a local copy here. + // Only relevant for SENDING_HEADER; blank otherwise. + std::string header; // Number of bytes we've sent of the header. Only relevant for SENDING_HEADER. size_t header_bytes_sent; @@ -61,13 +71,37 @@ private: // Map from file descriptor to client. std::map clients; + // Used for epoll implementation (obviously). 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)