1 #ifndef CYCLE_PTR_DETAIL_GENERATION_H 2 #define CYCLE_PTR_DETAIL_GENERATION_H 8 #include <cycle_ptr/detail/color.h> 9 #include <cycle_ptr/detail/base_control.h> 10 #include <cycle_ptr/detail/intrusive_ptr.h> 16 namespace cycle_ptr::detail {
22 friend auto intrusive_ptr_add_ref(
generation* g)
28 std::uintptr_t old = g->refs_.fetch_add(1u, std::memory_order_relaxed);
29 assert(old < UINTPTR_MAX);
32 friend auto intrusive_ptr_release(
generation* g)
37 std::uintptr_t old = g->refs_.fetch_sub(1u, std::memory_order_release);
40 if (old == 1u)
delete g;
56 assert(controls_.
empty());
64 static auto new_generation()
69 static auto new_generation(std::uintmax_t seq)
77 return origin.seq() < (dest.seq() & ~moveable_seq);
82 std::lock_guard<std::shared_mutex> lck{
mtx_ };
88 std::lock_guard<std::shared_mutex> lck{
mtx_ };
93 static constexpr std::uintmax_t moveable_seq = 0x1;
95 static auto new_seq_() noexcept -> std::uintmax_t;
101 return seq_.load(std::memory_order_relaxed);
104 auto gc() noexcept -> void;
117 -> std::shared_lock<std::shared_mutex>;
134 auto gc_() noexcept -> void;
147 auto gc_mark_() noexcept -> controls_list::iterator;
155 auto gc_phase2_mark_(controls_list::iterator b) noexcept
156 -> controls_list::iterator;
168 auto gc_sweep_(controls_list::iterator wavefront_end) noexcept
169 -> controls_list::iterator;
177 auto gc_phase2_sweep_(controls_list::iterator wavefront_end) noexcept
178 -> controls_list::iterator;
194 -> std::tuple<intrusive_ptr<generation>,
bool>;
219 std::tuple<generation*, bool> x,
220 std::tuple<generation*, bool> y,
221 [[maybe_unused]]
const std::unique_lock<std::shared_mutex>& x_mtx_lck,
222 [[maybe_unused]]
const std::unique_lock<std::shared_mutex>& x_merge_mtx_lck) noexcept
249 std::atomic<std::uintmax_t> seq_ = new_seq_();
251 std::atomic<std::uintptr_t> refs_{ 0u };
253 std::atomic_flag gc_flag_;
Definition: generation.h:19
Internally used datastructure for llist.
Definition: llist.h:15
auto empty() const noexcept -> bool
Test if this list is empty.
Definition: llist.h:85
std::shared_mutex red_promotion_mtx_
Lock to control weak red-promotions.
Definition: generation.h:245
Intrusive pointer.
Definition: intrusive_ptr.h:21
auto erase(const_iterator b) -> iterator
Erase element from the list.
Definition: llist.h:716
GC operations for delayed collection.
Definition: util.h:24
static auto fix_ordering(base_control &src, base_control &dst) noexcept -> std::shared_lock< std::shared_mutex >
Ensure src and dst meet constraint, in order to create an edge between them.
std::shared_mutex mtx_
Mutex protecting controls_ and GC.
Definition: generation.h:227
auto push_back(T &v) noexcept -> void
Link element into the list, as the last item.
Definition: llist.h:251
std::shared_mutex merge_mtx_
Mutex protecting merges.
Definition: generation.h:230
Base class for all control blocks.
Definition: base_control.h:30
static auto iterator_to(T &elem) noexcept -> iterator
Create iterator to element.
Definition: llist.h:110