50template <
typename T,
typename A>
51lock_free_stack<T, A>::lock_free_stack():
52 util::AllocatorConcurrentFreeList<A>(sizeof(node_t)),
55 static_assert(std::atomic<pointer_t>::is_always_lock_free);
60template <
typename T,
typename A>
61lock_free_stack<T, A>::~lock_free_stack()
63 node_t* top = top_.load(std::memory_order_acquire).get();
66 node_t*
const next = top->next;
78template <
typename T,
typename A>
79void lock_free_stack<T, A>::push(
const value_type& x)
88template <
typename T,
typename A>
89void lock_free_stack<T, A>::push(value_type&& x)
91 emplace(std::move(x));
98template <
typename T,
typename A>
99template <
class... Args>
100void lock_free_stack<T, A>::emplace(Args&&... args)
102 node_t* node = make_node();
105 new (&node->value) value_type(std::forward<Args>(args)...);
109 this->deallocate(node);
122template <
typename T,
typename A>
123bool lock_free_stack<T, A>::pop(value_type& x)
125 node_t*
const node = pop_node();
132 x = std::move(node->value);
151template <
typename T,
typename A>
152bool lock_free_stack<T, A>::pop_swap(value_type& x)
154 node_t*
const node = pop_node();
168template <
typename T,
typename A>
169typename lock_free_stack<T, A>::node_t*
170lock_free_stack<T, A>::make_node()
172 node_t* node =
static_cast<node_t*
>(this->allocate());
173 node->next =
nullptr;
179template <
typename T,
typename A>
180void lock_free_stack<T, A>::free_node(node_t* node)
182 node->value.~value_type();
183 this->deallocate(node);
188template <
typename T,
typename A>
189void lock_free_stack<T, A>::push_node(node_t* node)
191 pointer_t top = top_.load(std::memory_order_acquire);
195 node->next = top.get();
196 new_top = pointer_t(node, top.nextTag());
198 while (!top_.compare_exchange_weak(top, new_top));
203template <
typename T,
typename A>
204typename lock_free_stack<T, A>::node_t*
205lock_free_stack<T, A>::pop_node()
207 pointer_t top = top_.load(std::memory_order_acquire);
223 next = pointer_t(top->next, top.nextTag());
225 while (!top_.compare_exchange_weak(top, next));
const lass::python::impl::IterNextSlot next("__next__", Py_tp_iternext)
__next__ method (iterator next)
lass extensions to the standard library
Library for Assembled Shared Sources.