17constexpr size_t kMaxViewers = 2;
21 std::array<int, kMaxViewers> fds{};
35 for (Viewer& v : viewers_)
39 v = Viewer{
true, fd,
false, 0};
48 if (
auto i = index_of(fd))
50 viewers_[*i] = Viewer{};
58 for (
const Viewer& v : viewers_)
60 if (v.used && !v.busy && v.last_sequence_sent < sequence)
62 ready.fds[ready.count++] = v.fd;
68 void mark_sending(
int fd, uint32_t sequence)
70 if (
auto i = index_of(fd))
72 viewers_[*i].busy =
true;
73 viewers_[*i].last_sequence_sent = sequence;
77 void mark_done(
int fd)
79 if (
auto i = index_of(fd))
81 viewers_[*i].busy =
false;
85 std::optional<size_t> index_of(
int fd)
const
87 for (
size_t i = 0; i < kMaxViewers; ++i)
89 if (viewers_[i].used && viewers_[i].fd == fd)
100 for (
const Viewer& v : viewers_)
112 uint32_t last_sequence_sent = 0;
115 std::array<Viewer, kMaxViewers> viewers_{};
Definition viewer_set.h:26
ReadyList ready_for(uint32_t sequence) const
Viewers that are idle and have not yet been sent this sequence (or newer).
Definition viewer_set.h:55
bool add(int fd)
Add a viewer by socket fd. Adding an existing fd is a no-op. False when full.
Definition viewer_set.h:29
Fixed-capacity result so the stream path never allocates per frame.
Definition viewer_set.h:20