24 namespace seqan3::detail
30 struct writer_count :
public detail::strong_type<size_t, writer_count>
33 using base_t = detail::strong_type<size_t, writer_count>;
42 struct reader_count :
public detail::strong_type<size_t, reader_count>
45 using base_t = detail::strong_type<size_t, reader_count>;
73 class reader_writer_manager
78 class [[nodiscard]] scoped_writer_type
85 scoped_writer_type() =
delete;
86 scoped_writer_type(scoped_writer_type
const &) =
default;
87 scoped_writer_type(scoped_writer_type &&) =
default;
88 scoped_writer_type & operator=(scoped_writer_type
const &) =
default;
89 scoped_writer_type & operator=(scoped_writer_type &&) =
default;
94 explicit scoped_writer_type(reader_writer_manager & _manager) : manager{_manager}
100 manager.writer_arrive();
105 reader_writer_manager & manager;
109 class [[nodiscard]] scoped_reader_type
115 scoped_reader_type() =
delete;
116 scoped_reader_type(scoped_reader_type
const &) =
default;
117 scoped_reader_type(scoped_reader_type &&) =
default;
118 scoped_reader_type & operator=(scoped_reader_type
const &) =
default;
119 scoped_reader_type & operator=(scoped_reader_type &&) =
default;
124 explicit scoped_reader_type(reader_writer_manager & _manager) : manager{_manager}
128 ~scoped_reader_type()
130 manager.reader_arrive();
135 reader_writer_manager & manager;
142 reader_writer_manager() =
delete;
143 reader_writer_manager(reader_writer_manager
const &) =
delete;
144 reader_writer_manager(reader_writer_manager &&) =
delete;
145 reader_writer_manager & operator=(reader_writer_manager
const &) =
delete;
146 reader_writer_manager & operator=(reader_writer_manager &&) =
delete;
147 ~reader_writer_manager() =
default;
165 template <
typename concurrent_t>
167 requires requires { std::declval<concurrent_t>().close(); }
169 reader_writer_manager(reader_count
const rcount, writer_count
const wcount, concurrent_t & ds) :
170 reader_latch{static_cast<ptrdiff_t>(rcount.
get())},
171 writer_latch{static_cast<ptrdiff_t>(wcount.
get())},
172 completion_fn{[&ds] () { ds.close(); }}
174 if (rcount.get() < 1 || wcount.get() < 1)
195 void writer_arrive_and_wait() noexcept
197 writer_latch.arrive_and_wait();
218 void writer_arrive() noexcept
220 writer_latch.arrive();
222 if (writer_latch.try_wait())
241 void reader_arrive_and_wait() noexcept
243 reader_latch.arrive_and_wait();
260 void reader_arrive() noexcept
262 reader_latch.arrive();
282 scoped_writer_type register_writer() noexcept
284 return scoped_writer_type{*
this};
304 scoped_reader_type register_reader() noexcept
306 return scoped_reader_type{*
this};
constexpr std::size_t hardware_destructive_interference_size
Minimum offset between two objects to avoid false sharing.
Definition: new:34
constexpr auto const & get(configuration< configs_t... > const &config) noexcept
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: configuration.hpp:429
Provides C++17/20 additions to the <new> header, if they are not already available.
Provides basic data structure for strong types.
Provides seqan3::detail::latch.
Provides seqan3::detail::spin_delay.