24namespace seqan3::detail
30struct writer_count :
public detail::strong_type<size_t, writer_count>
33 using base_t = detail::strong_type<size_t, writer_count>;
42struct reader_count :
public detail::strong_type<size_t, reader_count>
45 using base_t = detail::strong_type<size_t, reader_count>;
72class reader_writer_manager
76 class [[nodiscard]] scoped_writer_type
83 scoped_writer_type() =
delete;
84 scoped_writer_type(scoped_writer_type
const &) =
default;
85 scoped_writer_type(scoped_writer_type &&) =
default;
86 scoped_writer_type & operator=(scoped_writer_type
const &) =
default;
87 scoped_writer_type & operator=(scoped_writer_type &&) =
default;
92 explicit scoped_writer_type(reader_writer_manager & _manager) : manager{_manager}
98 manager.writer_arrive();
103 reader_writer_manager & manager;
107 class [[nodiscard]] scoped_reader_type
113 scoped_reader_type() =
delete;
114 scoped_reader_type(scoped_reader_type
const &) =
default;
115 scoped_reader_type(scoped_reader_type &&) =
default;
116 scoped_reader_type & operator=(scoped_reader_type
const &) =
default;
117 scoped_reader_type & operator=(scoped_reader_type &&) =
default;
122 explicit scoped_reader_type(reader_writer_manager & _manager) : manager{_manager}
126 ~scoped_reader_type()
128 manager.reader_arrive();
133 reader_writer_manager & manager;
140 reader_writer_manager() =
delete;
141 reader_writer_manager(reader_writer_manager
const &) =
delete;
142 reader_writer_manager(reader_writer_manager &&) =
delete;
143 reader_writer_manager & operator=(reader_writer_manager
const &) =
delete;
144 reader_writer_manager & operator=(reader_writer_manager &&) =
delete;
145 ~reader_writer_manager() =
default;
163 template <
typename concurrent_t>
164 requires requires { std::declval<concurrent_t>().close(); }
165 reader_writer_manager(reader_count
const rcount, writer_count
const wcount, concurrent_t & ds) :
166 reader_latch{static_cast<ptrdiff_t>(rcount.
get())},
167 writer_latch{static_cast<ptrdiff_t>(wcount.
get())},
168 completion_fn{[&ds]()
173 if (rcount.get() < 1 || wcount.get() < 1)
194 void writer_arrive_and_wait() noexcept
196 writer_latch.arrive_and_wait();
217 void writer_arrive() noexcept
219 writer_latch.arrive();
221 if (writer_latch.try_wait())
240 void reader_arrive_and_wait() noexcept
242 reader_latch.arrive_and_wait();
259 void reader_arrive() noexcept
261 reader_latch.arrive();
281 scoped_writer_type register_writer() noexcept
283 return scoped_writer_type{*
this};
303 scoped_reader_type register_reader() noexcept
305 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
Provides seqan3::detail::latch.
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:415
The <new> header from C++17's standard library.
Provides seqan3::detail::spin_delay.
Provides basic data structure for strong types.