struct intrusive_traits : public traits
{
- typedef intrusive::basket_queue::base_hook< opt::gc<gc> > hook;
+ typedef cds::intrusive::basket_queue::base_hook< opt::gc<gc> > hook;
typedef node_deallocator disposer;
+ static CDS_CONSTEXPR const cds::intrusive::opt::link_check_type link_checker = cds::intrusive::basket_queue::traits::link_checker;
};
typedef cds::intrusive::BasketQueue< gc, node_type, intrusive_traits > type;
#endif
{
//@cond
- typedef details::make_basket_queue< GC, T, Options... > maker;
+ typedef details::make_basket_queue< GC, T, Traits > maker;
typedef typename maker::type base_class;
//@endcond
typename base_class::dequeue_result res;
if ( base_class::do_dequeue( res, true )) {
f( node_traits::to_value_ptr( *res.pNext )->m_value );
- base_class::dispose_result( res );
return true;
}
return false;
typedef intrusive::node_to_value<BasketQueue> node_to_value;
typedef typename opt::details::alignment_setter< atomic_marked_ptr, traits::alignment >::type aligned_node_ptr;
- typedef typename opt::details::alignment_setter< node_type, options::alignment >::type dummy_node_type;
+ typedef typename opt::details::alignment_setter< node_type, traits::alignment >::type dummy_node_type;
// GC and node_type::gc must be the same
static_assert( std::is_same<gc, typename node_type::gc>::value, "GC and node_type::gc must be the same");
void dispose_node( node_type * p )
{
- if ( p != m_Dummy.get() ) {
+ if ( p != &m_Dummy ) {
struct internal_disposer
{
void operator()( value_type * p )
};
gc::template retire<internal_disposer>( node_traits::to_value_ptr(p) );
}
- else
- m_Dummy.retire();
}
//@endcond
and, seems, unstable.
- Added: cds::container::TreiberStack::pop_with( Func )
- Added: member functions enqueue_with(Func), dequeue_with(Func) to cds::container::MSQueue,
- cds::container::MoirQueue.
+ cds::container::MoirQueue, cds::container::BasketQueue.
1.6.0 23.09.2014
General release
tests/test-hdr/misc/thread_init_fini.cpp
CDS_TESTHDR_SOURCES := \
+ $(CDS_TESTHDR_QUEUE) \
+ $(CDS_TESTHDR_STACK) \
$(CDS_TESTHDR_MAP) \
$(CDS_TESTHDR_DEQUE) \
$(CDS_TESTHDR_ORDLIST) \
$(CDS_TESTHDR_PQUEUE) \
- $(CDS_TESTHDR_QUEUE) \
$(CDS_TESTHDR_SET) \
- $(CDS_TESTHDR_STACK) \
$(CDS_TESTHDR_TREE) \
$(CDS_TESTHDR_MISC)
\ No newline at end of file
tests/test-hdr/tree/hdr_intrusive_ellen_bintree_rcu_sht_member.cpp
CDS_TESTHDR_OFFSETOF_SOURCES := \
+ $(CDS_TESTHDR_OFFSETOF_QUEUE) \
+ $(CDS_TESTHDR_OFFSETOF_STACK) \
$(CDS_TESTHDR_OFFSETOF_DEQUE) \
$(CDS_TESTHDR_OFFSETOF_MAP) \
$(CDS_TESTHDR_OFFSETOF_SET) \
$(CDS_TESTHDR_OFFSETOF_ORDLIST) \
- $(CDS_TESTHDR_OFFSETOF_QUEUE) \
- $(CDS_TESTHDR_OFFSETOF_STACK) \
$(CDS_TESTHDR_OFFSETOF_TREE)
\ No newline at end of file
,cds::opt::alignment< 16 >
>::type
> queue_type;
- test_ic< queue_type >();
+ test_no_ic< queue_type >();
}
void HdrTestQueue::BasketQueue_DHP_Counted_relax_align()
enum { alignment = 32 };
};
typedef cds::container::BasketQueue < cds::gc::DHP, int, traits > queue_type;
- test_ic< queue_type >( 0 );
+ test_ic< queue_type >();
}
void HdrTestQueue::BasketQueue_DHP_seqcst_align()
,cds::opt::alignment< cds::opt::cache_line_alignment >
> ::type
> queue_type;
- test_no_ic< queue_type >();
+ test_ic< queue_type >();
}
} // namespace queue
,cds::opt::alignment< 16 >
>::type
> queue_type;
- test_ic< queue_type >();
+ test_no_ic< queue_type >();
}
void HdrTestQueue::BasketQueue_HP_Counted_relax_align()
enum { alignment = 32 };
};
typedef cds::container::BasketQueue < cds::gc::HP, int, traits > queue_type;
- test_ic< queue_type >( 0 );
+ test_ic< queue_type >();
}
void HdrTestQueue::BasketQueue_HP_seqcst_align()
,cds::opt::alignment< cds::opt::cache_line_alignment >
> ::type
> queue_type;
- test_no_ic< queue_type >();
+ test_ic< queue_type >();
}
} // namespace queue
typename ci::basket_queue::make_traits<
ci::opt::hook<
ci::basket_queue::member_hook<
- offsetof(basket_queue::member_hook_item<cds::gc::DHP>, hMember),
+ offsetof( member_hook_item, hMember),
ci::opt::gc<cds::gc::DHP>
>
>
typename ci::basket_queue::make_traits<
ci::opt::hook<
ci::basket_queue::member_hook<
- offsetof(basket_queue::member_hook_item<cds::gc::DHP>, hMember),
+ offsetof(member_hook_item, hMember),
ci::opt::gc<cds::gc::DHP>
>
>
typename ci::basket_queue::make_traits<
ci::opt::hook<
ci::basket_queue::member_hook<
- offsetof(basket_queue::member_hook_item<cds::gc::DHP>, hMember),
+ offsetof(member_hook_item, hMember),
ci::opt::gc<cds::gc::DHP>
>
>
ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
,ci::opt::hook<
ci::basket_queue::member_hook<
- offsetof(basket_queue::member_hook_item<cds::gc::DHP>, hMember),
+ offsetof(member_hook_item, hMember),
ci::opt::gc<cds::gc::DHP>
>
>
typename ci::basket_queue::make_traits<
ci::opt::hook<
ci::basket_queue::member_hook<
- offsetof(basket_queue::member_hook_item<cds::gc::DHP>, hMember),
+ offsetof(member_hook_item, hMember),
ci::opt::gc<cds::gc::DHP>
>
>
typename ci::basket_queue::make_traits<
ci::opt::hook<
ci::basket_queue::member_hook<
- offsetof(basket_queue::member_hook_item<cds::gc::HP>, hMember),
+ offsetof( member_hook_item, hMember),
ci::opt::gc<cds::gc::HP>
>
>
namespace std {
// cds::intrusive::queue_stat
+ template <typename Counter>
+ static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
+ {
+ return o
+ << "\tStatistics:\n"
+ << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
+ << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
+ << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
+ << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
+ << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
+ << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
+ }
+ static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
+ {
+ return o;
+ }
+
+
template <typename Counter>
static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s)
{
return o;
}
- // cds::intrusive::basket_queue::stat
- template <typename Counter>
- static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
- {
- return o
- << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
- << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
- << "\t\t Add basket count: " << s.m_AddBasketCount.get() << "\n";
- }
-
- static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
- {
- return o;
- }
-
// cds::intrusive::fcqueue::stat
template <typename Counter>
static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
// Queue statistics
namespace std {
- // cds::intrusive::queue_stat
+ template <typename Counter>
+ static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
+ {
+ return o
+ << "\tStatistics:\n"
+ << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
+ << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
+ << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
+ << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
+ << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
+ << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
+ }
+ static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
+ {
+ return o;
+ }
+
template <typename Counter>
static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::stat<Counter> const& s)
{
return o;
}
-
template <typename Counter>
static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::stat<Counter> const& s )
{
static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
{
return o
- << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
- << "\t\t"
- << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
+ << "\tStatistics:\n"
+ << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
+ << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
+ << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
+ << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
+ << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
+ << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
+ << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
}
static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
return o;
}
- // cds::intrusive::basket_queue::stat
- template <typename Counter>
- static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
- {
- return o
- << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
- << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
- << "\t\t Add basket count: " << s.m_AddBasketCount.get() << "\n";
- }
-
- static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
- {
- return o;
- }
-
// cds::container::fcqueue::stat
template <typename Counter>
static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )