// What pool to fetch marks from, or NULL.
MarkPool *mark_pool;
+ // Queued data, if any. Protected by the owning Server's <queued_data_mutex>.
+ std::string queued_data;
+
// 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);
- // Add more input data to the stream. You should probably call wake_up_all_clients()
- // after that.
- void add_data(const char *data, ssize_t bytes);
+ // Add more data to <queued_data>, adding Metacube headers if needed.
+ // You should hold the owning Server's <queued_data_mutex>.
+ void add_data_deferred(const char *data, size_t bytes);
- // We have more data, so mark all clients that are sleeping as ready to go.
- void wake_up_all_clients();
+ // Add queued data to the stream, if any.
+ // You should hold the owning Server's <mutex> _and_ <queued_data_mutex>.
+ void process_queued_data();
private:
Stream(const Stream& other);
+ // Adds data directly to the stream file descriptor, without adding headers or
+ // going through <queued_data>. You should hold the owning Server's
+ // <mutex>.
void add_data_raw(const char *data, ssize_t bytes);
};