itch-mold-replay 1.0
Time-accurate NASDAQ TotalView-ITCH 5.0 replay over MoldUDP64
Loading...
Searching...
No Matches
retransmission_buffer.h
Go to the documentation of this file.
1#pragma once
2#include "imr/mold/types.h"
3#include <vector>
4#include <atomic>
5#include <cstddef>
6#include <optional>
7namespace imr::mold
8{
9 /** Retransmission buffer of the last `buffer_size` messages.
10 *
11 * Implemented as a circular array, using the sequence number as the index. Single writer (downstream),
12 * N readers (retransmission); acquire/release on write_seq_ guards buffer visibility across threads.
13 */
15 {
16 public:
17 /**
18 * @param buffer_size size of the retransmission buffer, in messages. Choose a power of two for faster
19 * lookup via bitmasking; non power-of-two sizes fall back to division.
20 *
21 * @throws std::invalid_argument if buffer_size is 0.
22 */
23 explicit RetransmissionBuffer(std::size_t buffer_size);
24
26 {
27 types::header::SequenceNumber sequence_number;
28 std::size_t file_position;
29 };
30
31 /// Records a message's file position under its sequence number, overwriting the oldest entry if the buffer is full.
32 void push(const MessageRecord& message_record) noexcept;
33
34 /// Returns the file position for seq_num, or std::nullopt if it's not currently in the buffer.
35 [[nodiscard]]
36 std::optional<std::size_t> file_position_for(types::header::SequenceNumber seq_num) const noexcept;
37
38 /// Capacity of the buffer, in messages.
39 [[nodiscard]]
40 std::size_t size() const noexcept;
41
42 private:
43 std::vector<MessageRecord> buffer_;
44
45 std::size_t mask_;
46 bool use_mask_;
47
48 alignas(64) std::atomic<types::header::SequenceNumber> write_seq_{0};
49
50 [[nodiscard]]
51 std::size_t index_for(types::header::SequenceNumber seq_num) const noexcept;
52 };
53}
Retransmission buffer of the last buffer_size messages.
Definition retransmission_buffer.h:15
void push(const MessageRecord &message_record) noexcept
Records a message's file position under its sequence number, overwriting the oldest entry if the buff...
std::optional< std::size_t > file_position_for(types::header::SequenceNumber seq_num) const noexcept
Returns the file position for seq_num, or std::nullopt if it's not currently in the buffer.
std::size_t size() const noexcept
Capacity of the buffer, in messages.
RetransmissionBuffer(std::size_t buffer_size)
Definition types.h:9
Definition types.h:7
Definition retransmission_buffer.h:26
std::size_t file_position
Definition retransmission_buffer.h:28
types::header::SequenceNumber sequence_number
Definition retransmission_buffer.h:27