X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=stream.cpp;h=d57157822aa93939c9250940bec1cf4132f212cb;hp=080d3bf95a5086a20338a6754dad5026babe791e;hb=ae994771c0747d43bd1ed422224f4caacb95ca9f;hpb=488f28bf7070f44469a006ed4a9d4c423788d175 diff --git a/stream.cpp b/stream.cpp index 080d3bf..d571578 100644 --- a/stream.cpp +++ b/stream.cpp @@ -68,6 +68,49 @@ void Stream::put_client_to_sleep(Client *client) sleeping_clients.push_back(client); } +void Stream::add_data(const char *data, ssize_t bytes) +{ + size_t pos = bytes_received % backlog_size; + bytes_received += bytes; + + if (pos + bytes > backlog_size) { + ssize_t to_copy = backlog_size - pos; + while (to_copy > 0) { + int ret = pwrite(data_fd, data, to_copy, pos); + if (ret == -1 && errno == EINTR) { + continue; + } + if (ret == -1) { + perror("pwrite"); + // Dazed and confused, but trying to continue... + break; + } + pos += ret; + data += ret; + to_copy -= ret; + bytes -= ret; + } + pos = 0; + } + + while (bytes > 0) { + int ret = pwrite(data_fd, data, bytes, pos); + if (ret == -1 && errno == EINTR) { + continue; + } + if (ret == -1) { + perror("pwrite"); + // Dazed and confused, but trying to continue... + break; + } + pos += ret; + data += ret; + bytes -= ret; + } + + wake_up_all_clients(); +} + void Stream::wake_up_all_clients() { if (to_process.empty()) {