// 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;
- // What stream we're connecting to; parsed from client_request.
+ // What stream we're connecting to; parsed from <request>.
// Not relevant for READING_REQUEST.
std::string stream_id;
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.
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<int> 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)