From a24d826ae11b2d80933ec62e96b410f22781dcac Mon Sep 17 00:00:00 2001 From: khizmax Date: Wed, 8 Oct 2014 09:01:38 +0400 Subject: [PATCH] BasketQueue refactoring (issues #1, #2, #3) --- cds/container/basket_queue.h | 6 +-- cds/intrusive/basket_queue.h | 6 +-- change.log | 2 +- projects/source.test-hdr.mk | 4 +- projects/source.test-hdr.offsetof.mk | 4 +- tests/test-hdr/queue/hdr_basketqueue_dhp.cpp | 6 +-- tests/test-hdr/queue/hdr_basketqueue_hp.cpp | 6 +-- .../queue/hdr_intrusive_basketqueue_dhp.cpp | 10 ++--- .../queue/hdr_intrusive_basketqueue_hp.cpp | 2 +- tests/unit/queue/intrusive_queue_type.h | 33 +++++++------- tests/unit/queue/queue_type.h | 45 ++++++++++--------- 11 files changed, 65 insertions(+), 59 deletions(-) diff --git a/cds/container/basket_queue.h b/cds/container/basket_queue.h index c3cda2a7..376600a2 100644 --- a/cds/container/basket_queue.h +++ b/cds/container/basket_queue.h @@ -124,8 +124,9 @@ namespace cds { namespace container { struct intrusive_traits : public traits { - typedef intrusive::basket_queue::base_hook< opt::gc > hook; + typedef cds::intrusive::basket_queue::base_hook< opt::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; @@ -209,7 +210,7 @@ namespace cds { namespace container { #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 @@ -369,7 +370,6 @@ namespace cds { namespace container { 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; diff --git a/cds/intrusive/basket_queue.h b/cds/intrusive/basket_queue.h index d825142e..4cace943 100644 --- a/cds/intrusive/basket_queue.h +++ b/cds/intrusive/basket_queue.h @@ -429,7 +429,7 @@ namespace cds { namespace intrusive { typedef intrusive::node_to_value 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::value, "GC and node_type::gc must be the same"); @@ -577,7 +577,7 @@ namespace cds { namespace intrusive { void dispose_node( node_type * p ) { - if ( p != m_Dummy.get() ) { + if ( p != &m_Dummy ) { struct internal_disposer { void operator()( value_type * p ) @@ -589,8 +589,6 @@ namespace cds { namespace intrusive { }; gc::template retire( node_traits::to_value_ptr(p) ); } - else - m_Dummy.retire(); } //@endcond diff --git a/change.log b/change.log index 5e4ee2ed..23f526ba 100644 --- a/change.log +++ b/change.log @@ -5,7 +5,7 @@ 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 diff --git a/projects/source.test-hdr.mk b/projects/source.test-hdr.mk index b0f18002..4b4fce3f 100644 --- a/projects/source.test-hdr.mk +++ b/projects/source.test-hdr.mk @@ -279,13 +279,13 @@ CDS_TESTHDR_MISC := \ 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 diff --git a/projects/source.test-hdr.offsetof.mk b/projects/source.test-hdr.offsetof.mk index 60985c89..71f363bd 100644 --- a/projects/source.test-hdr.offsetof.mk +++ b/projects/source.test-hdr.offsetof.mk @@ -92,10 +92,10 @@ CDS_TESTHDR_OFFSETOF_TREE := \ 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 diff --git a/tests/test-hdr/queue/hdr_basketqueue_dhp.cpp b/tests/test-hdr/queue/hdr_basketqueue_dhp.cpp index 66034cd6..5303e7f2 100644 --- a/tests/test-hdr/queue/hdr_basketqueue_dhp.cpp +++ b/tests/test-hdr/queue/hdr_basketqueue_dhp.cpp @@ -74,7 +74,7 @@ namespace queue { ,cds::opt::alignment< 16 > >::type > queue_type; - test_ic< queue_type >(); + test_no_ic< queue_type >(); } void HdrTestQueue::BasketQueue_DHP_Counted_relax_align() @@ -86,7 +86,7 @@ namespace queue { 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() @@ -109,7 +109,7 @@ namespace queue { ,cds::opt::alignment< cds::opt::cache_line_alignment > > ::type > queue_type; - test_no_ic< queue_type >(); + test_ic< queue_type >(); } } // namespace queue diff --git a/tests/test-hdr/queue/hdr_basketqueue_hp.cpp b/tests/test-hdr/queue/hdr_basketqueue_hp.cpp index 80b2a5b4..5466c1ad 100644 --- a/tests/test-hdr/queue/hdr_basketqueue_hp.cpp +++ b/tests/test-hdr/queue/hdr_basketqueue_hp.cpp @@ -74,7 +74,7 @@ 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() @@ -86,7 +86,7 @@ namespace queue { 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() @@ -109,7 +109,7 @@ namespace queue { ,cds::opt::alignment< cds::opt::cache_line_alignment > > ::type > queue_type; - test_no_ic< queue_type >(); + test_ic< queue_type >(); } } // namespace queue diff --git a/tests/test-hdr/queue/hdr_intrusive_basketqueue_dhp.cpp b/tests/test-hdr/queue/hdr_intrusive_basketqueue_dhp.cpp index 04546188..cf10659e 100644 --- a/tests/test-hdr/queue/hdr_intrusive_basketqueue_dhp.cpp +++ b/tests/test-hdr/queue/hdr_intrusive_basketqueue_dhp.cpp @@ -44,7 +44,7 @@ namespace queue { typename ci::basket_queue::make_traits< ci::opt::hook< ci::basket_queue::member_hook< - offsetof(basket_queue::member_hook_item, hMember), + offsetof( member_hook_item, hMember), ci::opt::gc > > @@ -69,7 +69,7 @@ namespace queue { typename ci::basket_queue::make_traits< ci::opt::hook< ci::basket_queue::member_hook< - offsetof(basket_queue::member_hook_item, hMember), + offsetof(member_hook_item, hMember), ci::opt::gc > > @@ -94,7 +94,7 @@ namespace queue { typename ci::basket_queue::make_traits< ci::opt::hook< ci::basket_queue::member_hook< - offsetof(basket_queue::member_hook_item, hMember), + offsetof(member_hook_item, hMember), ci::opt::gc > > @@ -120,7 +120,7 @@ namespace queue { ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > ,ci::opt::hook< ci::basket_queue::member_hook< - offsetof(basket_queue::member_hook_item, hMember), + offsetof(member_hook_item, hMember), ci::opt::gc > > @@ -145,7 +145,7 @@ namespace queue { typename ci::basket_queue::make_traits< ci::opt::hook< ci::basket_queue::member_hook< - offsetof(basket_queue::member_hook_item, hMember), + offsetof(member_hook_item, hMember), ci::opt::gc > > diff --git a/tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp b/tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp index f2e0242a..983a9927 100644 --- a/tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp +++ b/tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp @@ -70,7 +70,7 @@ namespace queue { typename ci::basket_queue::make_traits< ci::opt::hook< ci::basket_queue::member_hook< - offsetof(basket_queue::member_hook_item, hMember), + offsetof( member_hook_item, hMember), ci::opt::gc > > diff --git a/tests/unit/queue/intrusive_queue_type.h b/tests/unit/queue/intrusive_queue_type.h index f5c7e612..c4ff9ca2 100644 --- a/tests/unit/queue/intrusive_queue_type.h +++ b/tests/unit/queue/intrusive_queue_type.h @@ -433,6 +433,24 @@ namespace queue { namespace std { // cds::intrusive::queue_stat + template + static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat 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 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::stat const& s) { @@ -490,21 +508,6 @@ namespace std { return o; } - // cds::intrusive::basket_queue::stat - template - static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat const& s ) - { - return o - << static_cast 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 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat const& s ) diff --git a/tests/unit/queue/queue_type.h b/tests/unit/queue/queue_type.h index 64f92b93..6b450956 100644 --- a/tests/unit/queue/queue_type.h +++ b/tests/unit/queue/queue_type.h @@ -518,7 +518,23 @@ namespace queue { // Queue statistics namespace std { - // cds::intrusive::queue_stat + template + static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat 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 static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::stat const& s) { @@ -538,7 +554,6 @@ namespace std { return o; } - template static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::stat const& s ) { @@ -567,9 +582,14 @@ namespace std { static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat const& s ) { return o - << static_cast 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 ) @@ -577,21 +597,6 @@ namespace std { return o; } - // cds::intrusive::basket_queue::stat - template - static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat const& s ) - { - return o - << static_cast 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 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat const& s ) -- 2.34.1