10#define FMT_HEADER_ONLY
11#include <fmt/format.h>
22 static constexpr size_t CACHELINE_SIZE = 64;
31 std::atomic<size_t> head_cache = {0};
39 std::atomic<size_t> tail = {0};
45 alignas(CACHELINE_SIZE) std::atomic<size_t> head = {0};
53 template <
typename... Ts>
55 std::logic_error(
std::forward<Ts>(ts)...),
56 ringbuffer_message_type(m)
68 template <
typename Serializer,
typename... Ts>
71 write_multiple<Serializer>(m,
true, std::forward<Ts>(ts)...);
76 template <
typename Serializer,
typename... Ts>
79 return write_multiple<Serializer>(m,
false, std::forward<Ts>(ts)...);
82 template <
typename... Ts>
85 write_with<serializer::CommonSerializer>(m, std::forward<Ts>(ts)...);
88 template <
typename... Ts>
91 return try_write_with<serializer::CommonSerializer>(
92 m, std::forward<Ts>(ts)...);
113 size_t* identifier =
nullptr) = 0;
118 const WriteMarker& marker,
const uint8_t* bytes,
size_t size) = 0;
124 template <
typename Serializer,
typename... Ts>
125 bool write_multiple(
Message m,
bool wait, Ts&&... ts)
130 size_t total_size = std::apply(
131 [](
const auto&... section) {
return (section->size() + ... + 0); },
134 const auto initial_marker = prepare(m, total_size, wait);
136 if (!initial_marker.has_value())
139 auto next = initial_marker;
140 ccf::nonstd::tuple_for_each(sections, [&](
const auto& s) {
141 next = write_bytes(next, s->data(), s->size());
144 finish(initial_marker);
146 return next.has_value();
162#define DEFINE_RINGBUFFER_MSG_TYPE(NAME) \
163 NAME = ccf::ds::fnv_1a<ringbuffer::Message>(#NAME)
165 template <ringbuffer::Message m>
170 "No payload specialization for this Message");
173#define DECLARE_RINGBUFFER_MESSAGE_NO_PAYLOAD(MTYPE) \
175 struct ringbuffer::MessageSerializers<MTYPE> \
176 : public serializer::EmptySerializer \
179#define DECLARE_RINGBUFFER_MESSAGE_PAYLOAD(MTYPE, ...) \
181 struct ringbuffer::MessageSerializers<MTYPE> \
182 : public serializer::PreciseSerializer<__VA_ARGS__> \
191 w->template write_with<S>(m, std::forward<Ts>(ts)...);
199 return w->template try_write_with<S>(m, std::forward<Ts>(ts)...);
202 template <ringbuffer::Message m>
210 template <ringbuffer::Message m>
215 const uint8_t* data = span.data();
216 size_t size = span.size();
217 size_t original_size = size;
220 span = span.subspan(original_size - size);
229 write_message<m>(std::forward<Ts>(ts)...);
233 throw std::logic_error(fmt::format(
"[{}] {}", prefix, ex.what()));
239 char const* prefix, Ts&&... ts)
243 return try_write_message<m>(std::forward<Ts>(ts)...);
247 throw std::logic_error(fmt::format(
"[{}] {}", prefix, ex.what()));
255#define RINGBUFFER_WRITE_MESSAGE(MSG, ...) \
256 ringbuffer::write_message_with_error_wrapper<MSG>(#MSG, __VA_ARGS__)
258#define RINGBUFFER_TRY_WRITE_MESSAGE(MSG, ...) \
259 ringbuffer::try_write_message_with_error_wrapper<MSG>(#MSG, __VA_ARGS__)
Definition ring_buffer_types.h:153
virtual WriterPtr create_writer_to_inside()=0
virtual ~AbstractWriterFactory()=default
virtual WriterPtr create_writer_to_outside()=0
Definition ring_buffer_types.h:61
void write_with(Message m, Ts &&... ts)
Definition ring_buffer_types.h:69
bool try_write_with(Message m, Ts &&... ts)
Definition ring_buffer_types.h:77
virtual void finish(const WriteMarker &marker)=0
std::optional< size_t > WriteMarker
Definition ring_buffer_types.h:98
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:83
bool try_write(Message m, Ts &&... ts)
Definition ring_buffer_types.h:89
virtual size_t get_max_message_size()=0
Definition ring_buffer_types.h:49
Message ringbuffer_message_type
Definition ring_buffer_types.h:51
message_error(Message m, Ts &&... ts)
Definition ring_buffer_types.h:54
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:14
void write_message_with_error_wrapper(char const *prefix, Ts &&... ts)
Definition ring_buffer_types.h:225
void write_message(const WriterPtr &w, Ts &&... ts)
Definition ring_buffer_types.h:187
auto read_message(const uint8_t *&data, size_t &size)
Definition ring_buffer_types.h:203
bool try_write_message(const WriterPtr &w, Ts &&... ts)
Definition ring_buffer_types.h:195
bool try_write_message_with_error_wrapper(char const *prefix, Ts &&... ts)
Definition ring_buffer_types.h:238
std::shared_ptr< AbstractWriter > WriterPtr
Definition ring_buffer_types.h:150
uint32_t Message
Definition ring_buffer_types.h:19
Definition ring_buffer_types.h:167
Definition ring_buffer_types.h:25