8 #include <xenium/detail/port.hpp>
9 #include <xenium/reclamation/detail/deletable_object.hpp>
11 namespace xenium {
namespace reclamation {
namespace detail {
12 template <
class Node = deletable_
object>
19 template <
class Node = deletable_
object>
24 nodes.first =
nullptr;
28 ~retire_list() { assert(nodes.first ==
nullptr); }
32 node->next = nodes.first;
34 if (nodes.last ==
nullptr)
38 retired_nodes<Node> steal()
41 nodes.first =
nullptr;
46 bool empty()
const {
return nodes.first ==
nullptr; }
48 retired_nodes<Node> nodes;
51 template <
class Node = deletable_
object>
52 struct counting_retire_list
60 retired_nodes<Node> steal()
66 bool empty()
const {
return list.empty(); }
67 std::size_t size()
const {
return counter; }
69 retire_list<Node> list;
73 template <
class Node = deletable_
object>
76 void add(retired_nodes<Node> nodes)
78 assert(nodes.first !=
nullptr);
79 auto h = head.load(std::memory_order_relaxed);
83 }
while (!head.compare_exchange_weak(h, nodes.first,
84 std::memory_order_release,
85 std::memory_order_relaxed));
88 XENIUM_FORCEINLINE Node* adopt()
90 if (head.load(std::memory_order_relaxed) ==
nullptr)
94 return head.exchange(
nullptr, std::memory_order_acquire);
97 std::atomic<Node*> head;