10#define FMT_HEADER_ONLY
11#include <fmt/format.h>
22 static constexpr size_t CACHELINE_SIZE = 64;
31 std::atomic<size_t> head = {0};
38 alignas(CACHELINE_SIZE) std::atomic<size_t> head_cache = {0};
46 alignas(CACHELINE_SIZE) std::atomic<size_t> tail = {0};
55 template <
typename... Ts>
57 std::logic_error(
std::forward<Ts>(ts)...),
58 ringbuffer_message_type(m)
70 template <
typename Serializer,
typename... Ts>
73 write_multiple<Serializer>(m,
true, std::forward<Ts>(ts)...);
78 template <
typename Serializer,
typename... Ts>
81 return write_multiple<Serializer>(m,
false, std::forward<Ts>(ts)...);
84 template <
typename... Ts>
87 write_with<serializer::CommonSerializer>(m, std::forward<Ts>(ts)...);
90 template <
typename... Ts>
93 return try_write_with<serializer::CommonSerializer>(
94 m, std::forward<Ts>(ts)...);
115 size_t* identifier =
nullptr) = 0;
120 const WriteMarker& marker,
const uint8_t* bytes,
size_t size) = 0;
126 template <
typename Serializer,
typename... Ts>
127 bool write_multiple(
Message m,
bool wait, Ts&&... ts)
132 size_t total_size = std::apply(
133 [](
const auto&... section) {
return (section->size() + ... + 0); },
136 const auto initial_marker = prepare(m, total_size, wait);
138 if (!initial_marker.has_value())
143 auto next = initial_marker;
144 ccf::nonstd::tuple_for_each(sections, [&](
const auto& s) {
145 next = write_bytes(next, s->data(), s->size());
148 finish(initial_marker);
150 return next.has_value();
166#define DEFINE_RINGBUFFER_MSG_TYPE(NAME) \
167 NAME = ccf::ds::fnv_1a<ringbuffer::Message>(#NAME)
169 template <ringbuffer::Message m>
174 "No payload specialization for this Message");
177#define DECLARE_RINGBUFFER_MESSAGE_NO_PAYLOAD(MTYPE) \
179 struct ringbuffer::MessageSerializers<MTYPE> \
180 : public serializer::EmptySerializer \
183#define DECLARE_RINGBUFFER_MESSAGE_PAYLOAD(MTYPE, ...) \
185 struct ringbuffer::MessageSerializers<MTYPE> \
186 : public serializer::PreciseSerializer<__VA_ARGS__> \
195 w->template write_with<S>(m, std::forward<Ts>(ts)...);
203 return w->template try_write_with<S>(m, std::forward<Ts>(ts)...);
206 template <ringbuffer::Message m>
214 template <ringbuffer::Message m>
219 const uint8_t* data = span.data();
220 size_t size = span.size();
221 size_t original_size = size;
224 span = span.subspan(original_size - size);
233 write_message<m>(std::forward<Ts>(ts)...);
237 throw std::logic_error(fmt::format(
"[{}] {}", prefix, ex.what()));
243 char const* prefix, Ts&&... ts)
247 return try_write_message<m>(std::forward<Ts>(ts)...);
251 throw std::logic_error(fmt::format(
"[{}] {}", prefix, ex.what()));
259#define RINGBUFFER_WRITE_MESSAGE(MSG, ...) \
260 ringbuffer::write_message_with_error_wrapper<MSG>(#MSG, __VA_ARGS__)
262#define RINGBUFFER_TRY_WRITE_MESSAGE(MSG, ...) \
263 ringbuffer::try_write_message_with_error_wrapper<MSG>(#MSG, __VA_ARGS__)
Definition ring_buffer_types.h:157
virtual WriterPtr create_writer_to_inside()=0
virtual ~AbstractWriterFactory()=default
virtual WriterPtr create_writer_to_outside()=0
Definition ring_buffer_types.h:63
void write_with(Message m, Ts &&... ts)
Definition ring_buffer_types.h:71
bool try_write_with(Message m, Ts &&... ts)
Definition ring_buffer_types.h:79
virtual void finish(const WriteMarker &marker)=0
std::optional< size_t > WriteMarker
Definition ring_buffer_types.h:100
virtual ~AbstractWriter()=default
virtual WriteMarker prepare(Message m, size_t size, bool wait=true, size_t *identifier=nullptr)=0
virtual WriteMarker write_bytes(const WriteMarker &marker, const uint8_t *bytes, size_t size)=0
void write(Message m, Ts &&... ts)
Definition ring_buffer_types.h:85
bool try_write(Message m, Ts &&... ts)
Definition ring_buffer_types.h:91
virtual size_t get_max_message_size()=0
Definition ring_buffer_types.h:51
Message ringbuffer_message_type
Definition ring_buffer_types.h:53
message_error(Message m, Ts &&... ts)
Definition ring_buffer_types.h:56
T deserialize(const uint8_t *&data, size_t &size)
Definition map_serializers.h:62
size_t serialize(const T &t, uint8_t *&data, size_t &size)
Definition map_serializers.h:48
Definition non_blocking.h:15
void write_message_with_error_wrapper(char const *prefix, Ts &&... ts)
Definition ring_buffer_types.h:229
void write_message(const WriterPtr &w, Ts &&... ts)
Definition ring_buffer_types.h:191
auto read_message(const uint8_t *&data, size_t &size)
Definition ring_buffer_types.h:207
bool try_write_message(const WriterPtr &w, Ts &&... ts)
Definition ring_buffer_types.h:199
bool try_write_message_with_error_wrapper(char const *prefix, Ts &&... ts)
Definition ring_buffer_types.h:242
std::shared_ptr< AbstractWriter > WriterPtr
Definition ring_buffer_types.h:154
uint32_t Message
Definition ring_buffer_types.h:19
Definition ring_buffer_types.h:171
Definition ring_buffer_types.h:26