3 #ifndef __CDS_INTRUSIVE_DETAILS_DUMMY_NODE_HOLDER_H
4 #define __CDS_INTRUSIVE_DETAILS_DUMMY_NODE_HOLDER_H
6 #include <cds/gc/gc_fwd.h>
7 #include <cds/details/allocator.h>
10 namespace cds { namespace intrusive { namespace details {
12 template <typename GC, typename Node, typename Alloc = CDS_DEFAULT_ALLOCATOR>
13 class dummy_node: public Node
15 typedef Node node_type;
28 template <typename Node, typename Alloc>
29 class dummy_node< cds::gc::HRC, Node, Alloc >
31 typedef Node node_type;
32 typedef cds::gc::HRC gc;
33 typedef cds::details::Allocator< node_type, Alloc> allocator_type;
37 struct dummy_node_disposer {
38 void operator()( node_type * p )
40 assert( p != null_ptr<node_type *>());
42 p->m_pNext.store( null_ptr<node_type *>(), CDS_ATOMIC::memory_order_release );
43 allocator_type().Delete( p );
49 : m_pDummy( allocator_type().New() )
59 gc::template retire<dummy_node_disposer>( m_pDummy );
63 }}} // namepace cds::intrusive::details
67 #endif // #ifndef __CDS_INTRUSIVE_DETAILS_DUMMY_NODE_HOLDER_H