From: khizmax Date: Tue, 23 Jun 2015 18:58:53 +0000 (+0300) Subject: Changed: use padding option instead of alignment one X-Git-Tag: v2.1.0~199 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a01ecc87dadf753538d4c22feb98f7e00a66a4d1;p=libcds.git Changed: use padding option instead of alignment one --- diff --git a/cds/container/basket_queue.h b/cds/container/basket_queue.h index a379a546..d9f9d965 100644 --- a/cds/container/basket_queue.h +++ b/cds/container/basket_queue.h @@ -48,22 +48,22 @@ namespace cds { namespace container { */ typedef opt::v::relaxed_ordering memory_model; - /// Alignment of internal queue data. Default is \p opt::cache_line_alignment - enum { alignment = opt::cache_line_alignment }; + /// Padding for internal critical atomic data. Default is \p opt::cache_line_padding + enum { padding = opt::cache_line_padding }; }; /// Metafunction converting option list to \p basket_queue::traits /** Supported \p Options are: - - opt::allocator - allocator (like \p std::allocator) used for allocating queue nodes. Default is \ref CDS_DEFAULT_ALLOCATOR - - opt::back_off - back-off strategy used, default is \p cds::backoff::empty. - - opt::item_counter - the type of item counting feature. Default is \p cds::atomicity::empty_item_counter (item counting disabled) + - \p opt::allocator - allocator (like \p std::allocator) used for allocating queue nodes. Default is \ref CDS_DEFAULT_ALLOCATOR + - \p opt::back_off - back-off strategy used, default is \p cds::backoff::empty. + - \p opt::item_counter - the type of item counting feature. Default is \p cds::atomicity::empty_item_counter (item counting disabled) To enable item counting use \p cds::atomicity::item_counter - - opt::stat - the type to gather internal statistics. + - \ opt::stat - the type to gather internal statistics. Possible statistics types are: \p basket_queue::stat, \p basket_queue::empty_stat, user-provided class that supports \p %basket_queue::stat interface. Default is \p %basket_queue::empty_stat. - - opt::alignment - the alignment for internal queue data. Default is \p opt::cache_line_alignment - - opt::memory_model - C++ memory ordering model. Can be \p opt::v::relaxed_ordering (relaxed memory model, the default) + - \p opt::padding - padding for internal critical atomic data. Default is \p opt::cache_line_padding + - \p opt::memory_model - C++ memory ordering model. Can be \p opt::v::relaxed_ordering (relaxed memory model, the default) or \p opt::v::sequential_consistent (sequentially consisnent memory model). Example: declare \p %BasketQueue with item counting and internal statistics diff --git a/cds/container/msqueue.h b/cds/container/msqueue.h index 1d355e97..0c021445 100644 --- a/cds/container/msqueue.h +++ b/cds/container/msqueue.h @@ -46,8 +46,8 @@ namespace cds { namespace container { */ typedef opt::v::relaxed_ordering memory_model; - /// Alignment of internal queue data. Default is \p opt::cache_line_alignment - enum { alignment = opt::cache_line_alignment }; + /// Padding for internal critical atomic data. Default is \p opt::cache_line_padding + enum { padding = opt::cache_line_padding }; }; /// Metafunction converting option list to \p msqueue::traits @@ -60,7 +60,7 @@ namespace cds { namespace container { - \p opt::stat - the type to gather internal statistics. Possible statistics types are: \p msqueue::stat, \p msqueue::empty_stat, user-provided class that supports \p %msqueue::stat interface. Default is \p %msqueue::empty_stat. - - \p opt::alignment - the alignment for internal queue data. Default is \p opt::cache_line_alignment + - \p opt::padding - padding for internal critical atomic data. Default is \p opt::cache_line_padding - \p opt::memory_model - C++ memory ordering model. Can be \p opt::v::relaxed_ordering (relaxed memory model, the default) or \p opt::v::sequential_consistent (sequentially consisnent memory model). diff --git a/cds/intrusive/basket_queue.h b/cds/intrusive/basket_queue.h index 46796dc8..6fc8b81b 100644 --- a/cds/intrusive/basket_queue.h +++ b/cds/intrusive/basket_queue.h @@ -228,8 +228,8 @@ namespace cds { namespace intrusive { /// Link checking, see \p cds::opt::link_checker static CDS_CONSTEXPR const opt::link_check_type link_checker = opt::debug_check_link; - /// Alignment for internal queue data. Default is \p opt::cache_line_alignment - enum { alignment = opt::cache_line_alignment }; + /// Padding for internal critical atomic data. Default is \p opt::cache_line_padding + enum { padding = opt::cache_line_padding }; }; @@ -248,7 +248,7 @@ namespace cds { namespace intrusive { - opt::stat - the type to gather internal statistics. Possible statistics types are: \p basket_queue::stat, \p basket_queue::empty_stat, user-provided class that supports \p %basket_queue::stat interface. Default is \p %basket_queue::empty_stat (internal statistics disabled). - - opt::alignment - the alignment for internal queue data. Default is \p opt::cache_line_alignment + - \p opt::padding - padding for internal critical atomic data. Default is \p opt::cache_line_padding - opt::memory_model - C++ memory ordering model. Can be \p opt::v::relaxed_ordering (relaxed memory model, the default) or \p opt::v::sequential_consistent (sequentially consisnent memory model). @@ -379,7 +379,7 @@ namespace cds { namespace intrusive { // BasketQueue with Hazard Pointer garbage collector, // member hook + item disposer + item counter, - // without alignment of internal queue data: + // without padding of internal queue data: struct Bar { // Your data @@ -397,7 +397,7 @@ namespace cds { namespace intrusive { > ,ci::opt::disposer< fooDisposer > ,cds::opt::item_counter< cds::atomicity::item_counter > - ,cds::opt::alignment< cds::opt::no_special_alignment > + ,cds::opt::padding< cds::opt::no_special_padding > >::type {}; typedef ci::BasketQueue< hp_gc, Bar, barTraits > barQueue; @@ -434,16 +434,16 @@ namespace cds { namespace intrusive { typedef typename node_type::marked_ptr marked_ptr; typedef typename node_type::atomic_marked_ptr atomic_marked_ptr; - typedef typename opt::details::alignment_setter< atomic_marked_ptr, traits::alignment >::type aligned_node_ptr; - 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"); //@endcond - aligned_node_ptr m_pHead ; ///< Queue's head pointer (aligned) - aligned_node_ptr m_pTail ; ///< Queue's tail pointer (aligned) - dummy_node_type m_Dummy ; ///< dummy node + atomic_marked_ptr m_pHead ; ///< Queue's head pointer (aligned) + typename opt::details::apply_padding< atomic_marked_ptr, traits::padding >::padding_type pad1_; + atomic_marked_ptr m_pTail ; ///< Queue's tail pointer (aligned) + typename opt::details::apply_padding< atomic_marked_ptr, traits::padding >::padding_type pad2_; + node_type m_Dummy ; ///< dummy node + typename opt::details::apply_padding< node_type, traits::padding >::padding_type pad3_; item_counter m_ItemCounter ; ///< Item counter stat m_Stat ; ///< Internal statistics //@cond diff --git a/cds/intrusive/details/single_link_struct.h b/cds/intrusive/details/single_link_struct.h index d8365998..b235b593 100644 --- a/cds/intrusive/details/single_link_struct.h +++ b/cds/intrusive/details/single_link_struct.h @@ -36,9 +36,10 @@ namespace cds { namespace intrusive { atomic_node_ptr m_pNext ; ///< pointer to the next node in the container - node() - : m_pNext( nullptr ) - {} + node() CDS_NOEXCEPT + { + m_pNext.store( nullptr, atomics::memory_order_release ); + } }; //@cond diff --git a/cds/intrusive/moir_queue.h b/cds/intrusive/moir_queue.h index 0928dd22..ecd76bd9 100644 --- a/cds/intrusive/moir_queue.h +++ b/cds/intrusive/moir_queue.h @@ -61,7 +61,7 @@ namespace cds { namespace intrusive { // MoirQueue with Hazard Pointer garbage collector, // member hook + item disposer + item counter, - // without alignment of internal queue data: + // without padding of internal queue data: struct Bar { // Your data @@ -74,7 +74,7 @@ namespace cds { namespace intrusive { typedef ci::msqueue::member_hook< offsetof(Bar, hMember), ,ci::opt::gc > hook; typedef fooDisposer disposer; typedef cds::atomicity::item_counter item_counter; - enum { aligment = cds::opt::no_special_alignment alignment }; + enum { padding = cds::opt::no_special_padding }; }; typedef ci::MoirQueue< hp_gc, Bar, barQueueTraits > barQueue; \endcode diff --git a/cds/intrusive/msqueue.h b/cds/intrusive/msqueue.h index e9b30f75..9bd71f5d 100644 --- a/cds/intrusive/msqueue.h +++ b/cds/intrusive/msqueue.h @@ -171,8 +171,8 @@ namespace cds { namespace intrusive { /// Link checking, see \p cds::opt::link_checker static CDS_CONSTEXPR const opt::link_check_type link_checker = opt::debug_check_link; - /// Alignment for internal queue data. Default is \p opt::cache_line_alignment - enum { alignment = opt::cache_line_alignment }; + /// Padding for internal critical atomic data. Default is \p opt::cache_line_padding + enum { padding = opt::cache_line_padding }; }; /// Metafunction converting option list to \p msqueue::traits @@ -190,7 +190,7 @@ namespace cds { namespace intrusive { - \p opt::stat - the type to gather internal statistics. Possible statistics types are: \p msqueue::stat, \p msqueue::empty_stat, user-provided class that supports \p %msqueue::stat interface. Default is \p %msqueue::empty_stat (internal statistics disabled). - - \p opt::alignment - the alignment for internal queue data. Default is \p opt::cache_line_alignment + - \p opt::padding - padding for internal critical atomic data. Default is \p opt::cache_line_padding - \p opt::memory_model - C++ memory ordering model. Can be \p opt::v::relaxed_ordering (relaxed memory model, the default) or \p opt::v::sequential_consistent (sequentially consisnent memory model). @@ -287,7 +287,7 @@ namespace cds { namespace intrusive { // Example 2: // MSQueue with Hazard Pointer garbage collector, // member hook + item disposer + item counter, - // without alignment of internal queue data + // without padding of internal queue data // Use msqueue::make_traits struct Bar { @@ -307,7 +307,7 @@ namespace cds { namespace intrusive { > ,ci::opt::disposer< fooDisposer > ,cds::opt::item_counter< cds::atomicity::item_counter > - ,cds::opt::alignment< cds::opt::no_special_alignment > + ,cds::opt::padding< cds::opt::no_special_padding > >::type > barQueue; \endcode @@ -345,14 +345,16 @@ namespace cds { namespace intrusive { // GC and node_type::gc must be the same static_assert((std::is_same::value), "GC and node_type::gc must be the same"); - typedef typename opt::details::alignment_setter< typename node_type::atomic_node_ptr, traits::alignment >::type aligned_node_ptr; - typedef typename opt::details::alignment_setter< node_type, traits::alignment >::type dummy_node_type; + typedef typename node_type::atomic_node_ptr atomic_node_ptr; - aligned_node_ptr m_pHead ; ///< Queue's head pointer - aligned_node_ptr m_pTail ; ///< Queue's tail pointer - dummy_node_type m_Dummy ; ///< dummy node - item_counter m_ItemCounter ; ///< Item counter - stat m_Stat ; ///< Internal statistics + atomic_node_ptr m_pHead; ///< Queue's head pointer + typename opt::details::apply_padding< atomic_node_ptr, traits::padding >::padding_type pad1_; + atomic_node_ptr m_pTail; ///< Queue's tail pointer + typename opt::details::apply_padding< atomic_node_ptr, traits::padding >::padding_type pad2_; + node_type m_Dummy; ///< dummy node + typename opt::details::apply_padding< node_type, traits::padding >::padding_type pad3_; + item_counter m_ItemCounter; ///< Item counter + stat m_Stat; ///< Internal statistics //@endcond //@cond @@ -554,8 +556,8 @@ namespace cds { namespace intrusive { bool empty() const { typename gc::Guard guard; - return guard.protect( m_pHead, []( node_type * p ) -> value_type * { return node_traits::to_value_ptr( p );}) - ->m_pNext.load( memory_model::memory_order_relaxed ) == nullptr; + node_type * p = guard.protect( m_pHead, []( node_type * p ) -> value_type * { return node_traits::to_value_ptr( p );}); + return p->m_pNext.load( memory_model::memory_order_relaxed ) == nullptr; } /// Clear the queue diff --git a/cds/intrusive/optimistic_queue.h b/cds/intrusive/optimistic_queue.h index 65d883c3..a7684849 100644 --- a/cds/intrusive/optimistic_queue.h +++ b/cds/intrusive/optimistic_queue.h @@ -32,10 +32,11 @@ namespace cds { namespace intrusive { atomic_node_ptr m_pPrev ; ///< Pointer to previous node atomic_node_ptr m_pNext ; ///< Pointer to next node - CDS_CONSTEXPR node() CDS_NOEXCEPT - : m_pPrev( nullptr ) - , m_pNext( nullptr ) - {} + node() CDS_NOEXCEPT + { + m_pPrev.store( nullptr, atomics::memory_order_release ); + m_pNext.store( nullptr, atomics::memory_order_release ); + } }; //@cond @@ -464,10 +465,10 @@ namespace cds { namespace intrusive { assert( pHead != nullptr ); pFirstNodePrev = res.guards.protect( 2, pHead->m_pPrev, [](node_type * p) -> value_type * {return node_traits::to_value_ptr(p);}); - if ( pHead == m_pHead.load(memory_model::memory_order_relaxed)) { + if ( pHead == m_pHead.load(memory_model::memory_order_acquire)) { if ( pTail != pHead ) { if ( pFirstNodePrev == nullptr - || pFirstNodePrev->m_pNext.load(memory_model::memory_order_relaxed) != pHead ) + || pFirstNodePrev->m_pNext.load(memory_model::memory_order_acquire) != pHead ) { fix_list( pTail, pHead ); continue; @@ -509,8 +510,8 @@ namespace cds { namespace intrusive { pCurNode = pTail; while ( pCurNode != pHead ) { // While not at head - pCurNodeNext = guards.protect(0, pCurNode->m_pNext, [](node_type * p) -> value_type * {return node_traits::to_value_ptr(p);} ); - if ( pHead != m_pHead.load(memory_model::memory_order_relaxed) ) + pCurNodeNext = guards.protect(0, pCurNode->m_pNext, [](node_type * p) -> value_type * { return node_traits::to_value_ptr(p);}); + if ( pHead != m_pHead.load(memory_model::memory_order_acquire)) break; pCurNodeNext->m_pPrev.store( pCurNode, memory_model::memory_order_release ); guards.assign( 1, node_traits::to_value_ptr( pCurNode = pCurNodeNext )); diff --git a/cds/opt/options.h b/cds/opt/options.h index a14c7054..11e01a0a 100644 --- a/cds/opt/options.h +++ b/cds/opt/options.h @@ -408,7 +408,6 @@ namespace opt { struct alignment_setter { typedef typename cds::details::aligned_type< Type, c_nCacheLineSize >::type type; }; - } // namespace details //@endcond @@ -468,6 +467,7 @@ namespace opt { struct type { T data; }; + typedef void padding_type; }; template @@ -476,23 +476,27 @@ namespace opt { struct type { T data; }; + typedef void padding_type; }; template struct apply_padding_helper < T, Padding, false, padding_datasize_less, TinyOnly > { + typedef uint8_t padding_type[Padding - sizeof( T )]; struct type { T data; - uint8_t pad_[Padding - sizeof( T )]; + padding_type pad_; }; + }; template struct apply_padding_helper < T, Padding, false, padding_datasize_greater, false > { + typedef uint8_t padding_type[Padding - sizeof( T ) % Padding]; struct type { T data; - uint8_t pad_[Padding - sizeof( T ) % Padding]; + padding_type pad_; }; }; @@ -502,6 +506,7 @@ namespace opt { struct type { T data; }; + typedef void padding_type; }; template @@ -517,12 +522,20 @@ namespace opt { static_assert( (c_nPadding & (c_nPadding - 1)) == 0, "Padding must be a power-of-two number" ); - typedef typename apply_padding_helper< T, + typedef apply_padding_helper< T, c_nPadding, c_nPadding == 0, sizeof( T ) < c_nPadding ? padding_datasize_less : sizeof( T ) == c_nPadding ? padding_datasize_equal : padding_datasize_greater, (Padding & padding_tiny_data_only) != 0 - >::type type; + > result; + + typedef typename result::type type; + + typedef typename std::conditional< + std::is_same< typename result::padding_type, void >::value, + unsigned int, + typename result::padding_type + >::type padding_type; }; } // namespace details diff --git a/tests/test-hdr/queue/hdr_basketqueue_dhp.cpp b/tests/test-hdr/queue/hdr_basketqueue_dhp.cpp index c0accb30..c48ef031 100644 --- a/tests/test-hdr/queue/hdr_basketqueue_dhp.cpp +++ b/tests/test-hdr/queue/hdr_basketqueue_dhp.cpp @@ -71,7 +71,7 @@ namespace queue { typedef cds::container::BasketQueue < cds::gc::DHP, int, typename cds::container::basket_queue::make_traits < cds::opt::memory_model< cds::opt::v::relaxed_ordering> - ,cds::opt::alignment< 16 > + ,cds::opt::padding< 16 > >::type > queue_type; test_no_ic< queue_type >(); @@ -83,7 +83,7 @@ namespace queue { { typedef cds::atomicity::item_counter item_counter; typedef cds::opt::v::relaxed_ordering memory_model; - enum { alignment = 32 }; + enum { padding = 32 }; }; typedef cds::container::BasketQueue < cds::gc::DHP, int, traits > queue_type; test_ic< queue_type >(); @@ -94,7 +94,7 @@ namespace queue { typedef cds::container::BasketQueue < cds::gc::DHP, int, typename cds::container::basket_queue::make_traits < cds::opt::memory_model< cds::opt::v::sequential_consistent> - , cds::opt::alignment< cds::opt::no_special_alignment > + , cds::opt::padding< cds::opt::no_special_padding > > ::type > queue_type; test_no_ic< queue_type >(); @@ -106,7 +106,7 @@ namespace queue { typename cds::container::basket_queue::make_traits < cds::opt::item_counter< cds::atomicity::item_counter > ,cds::opt::memory_model< cds::opt::v::sequential_consistent> - ,cds::opt::alignment< cds::opt::cache_line_alignment > + ,cds::opt::padding< cds::opt::cache_line_padding > > ::type > queue_type; test_ic< queue_type >(); diff --git a/tests/test-hdr/queue/hdr_basketqueue_hp.cpp b/tests/test-hdr/queue/hdr_basketqueue_hp.cpp index fcc0e2c7..2e608d3a 100644 --- a/tests/test-hdr/queue/hdr_basketqueue_hp.cpp +++ b/tests/test-hdr/queue/hdr_basketqueue_hp.cpp @@ -71,7 +71,7 @@ namespace queue { typedef cds::container::BasketQueue < cds::gc::HP, int, typename cds::container::basket_queue::make_traits < cds::opt::memory_model< cds::opt::v::relaxed_ordering> - ,cds::opt::alignment< 16 > + ,cds::opt::padding< 16 > >::type > queue_type; test_no_ic< queue_type >(); @@ -83,7 +83,7 @@ namespace queue { { typedef cds::atomicity::item_counter item_counter; typedef cds::opt::v::relaxed_ordering memory_model; - enum { alignment = 32 }; + enum { padding = 32 }; }; typedef cds::container::BasketQueue < cds::gc::HP, int, traits > queue_type; test_ic< queue_type >(); @@ -94,7 +94,7 @@ namespace queue { typedef cds::container::BasketQueue < cds::gc::HP, int, typename cds::container::basket_queue::make_traits < cds::opt::memory_model< cds::opt::v::sequential_consistent> - , cds::opt::alignment< cds::opt::no_special_alignment > + , cds::opt::padding< cds::opt::no_special_padding > > ::type > queue_type; test_no_ic< queue_type >(); @@ -106,7 +106,7 @@ namespace queue { typename cds::container::basket_queue::make_traits < cds::opt::item_counter< cds::atomicity::item_counter > ,cds::opt::memory_model< cds::opt::v::sequential_consistent> - ,cds::opt::alignment< cds::opt::cache_line_alignment > + ,cds::opt::padding< cds::opt::cache_line_padding > > ::type > queue_type; test_ic< queue_type >(); diff --git a/tests/test-hdr/queue/hdr_intrusive_basketqueue_dhp.cpp b/tests/test-hdr/queue/hdr_intrusive_basketqueue_dhp.cpp index a7c45e50..b10d18b2 100644 --- a/tests/test-hdr/queue/hdr_intrusive_basketqueue_dhp.cpp +++ b/tests/test-hdr/queue/hdr_intrusive_basketqueue_dhp.cpp @@ -78,18 +78,18 @@ namespace queue { >::type > BasketQueue_DHP_member_stat; - // DHP base hook + alignment + // DHP base hook + padding typedef ci::BasketQueue< cds::gc::DHP, base_hook_item, typename ci::basket_queue::make_traits< ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > ,ci::opt::hook< ci::basket_queue::base_hook< ci::opt::gc > > - ,co::alignment< 32 > + ,co::padding< 32 > >::type > BasketQueue_DHP_base_align; - // DHP member hook + alignment + // DHP member hook + padding typedef ci::BasketQueue< cds::gc::DHP, member_hook_item, typename ci::basket_queue::make_traits< ci::opt::hook< @@ -98,23 +98,23 @@ namespace queue { ci::opt::gc > > - ,co::alignment< 32 > + ,co::padding< 32 > ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > >::type > BasketQueue_DHP_member_align; - // DHP base hook + no alignment + // DHP base hook + no padding typedef ci::BasketQueue< cds::gc::DHP, base_hook_item, typename ci::basket_queue::make_traits< ci::opt::hook< ci::basket_queue::base_hook< ci::opt::gc > > ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > - ,co::alignment< co::no_special_alignment > + ,co::padding< co::no_special_padding > >::type > BasketQueue_DHP_base_noalign; - // DHP member hook + no alignment + // DHP member hook + no padding typedef ci::BasketQueue< cds::gc::DHP, member_hook_item, typename ci::basket_queue::make_traits< ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > @@ -124,23 +124,23 @@ namespace queue { ci::opt::gc > > - ,co::alignment< co::no_special_alignment > + ,co::padding< co::no_special_padding > >::type > BasketQueue_DHP_member_noalign; - // DHP base hook + cache alignment + // DHP base hook + cache padding typedef ci::BasketQueue< cds::gc::DHP, base_hook_item, typename ci::basket_queue::make_traits< ci::opt::hook< ci::basket_queue::base_hook< ci::opt::gc > > - ,co::alignment< co::cache_line_alignment > + ,co::padding< co::cache_line_padding > ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > >::type > BasketQueue_DHP_base_cachealign; - // DHP member hook + cache alignment + // DHP member hook + cache padding typedef ci::BasketQueue< cds::gc::DHP, member_hook_item, typename ci::basket_queue::make_traits< ci::opt::hook< @@ -149,7 +149,7 @@ namespace queue { ci::opt::gc > > - ,co::alignment< co::cache_line_alignment > + ,co::padding< co::cache_line_padding > ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > >::type > BasketQueue_DHP_member_cachealign; diff --git a/tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp b/tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp index 983a9927..82964ee2 100644 --- a/tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp +++ b/tests/test-hdr/queue/hdr_intrusive_basketqueue_hp.cpp @@ -104,18 +104,18 @@ namespace queue { >::type > BasketQueue_HP_member_stat; - // HP base hook + alignment + // HP base hook + padding typedef ci::BasketQueue< cds::gc::HP, base_hook_item, typename ci::basket_queue::make_traits< ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > ,ci::opt::hook< ci::basket_queue::base_hook< ci::opt::gc > > - ,co::alignment< 32 > + ,co::padding< 32 > >::type > BasketQueue_HP_base_align; - // HP member hook + alignment + // HP member hook + padding typedef ci::BasketQueue< cds::gc::HP, member_hook_item, typename ci::basket_queue::make_traits< ci::opt::hook< @@ -124,23 +124,23 @@ namespace queue { ci::opt::gc > > - ,co::alignment< 32 > + ,co::padding< 32 > ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > >::type > BasketQueue_HP_member_align; - // HP base hook + no alignment + // HP base hook + no padding typedef ci::BasketQueue< cds::gc::HP, base_hook_item, typename ci::basket_queue::make_traits< ci::opt::hook< ci::basket_queue::base_hook< ci::opt::gc > > ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > - ,co::alignment< co::no_special_alignment > + ,co::padding< co::no_special_padding > >::type > BasketQueue_HP_base_noalign; - // HP member hook + no alignment + // HP member hook + no padding typedef ci::BasketQueue< cds::gc::HP, member_hook_item, typename ci::basket_queue::make_traits< ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > @@ -150,23 +150,23 @@ namespace queue { ci::opt::gc > > - ,co::alignment< co::no_special_alignment > + ,co::padding< co::no_special_padding > >::type > BasketQueue_HP_member_noalign; - // HP base hook + cache alignment + // HP base hook + cache padding typedef ci::BasketQueue< cds::gc::HP, base_hook_item, typename ci::basket_queue::make_traits< ci::opt::hook< ci::basket_queue::base_hook< ci::opt::gc > > - ,co::alignment< co::cache_line_alignment > + ,co::padding< co::cache_line_padding > ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > >::type > BasketQueue_HP_base_cachealign; - // HP member hook + cache alignment + // HP member hook + cache padding typedef ci::BasketQueue< cds::gc::HP, member_hook_item, typename ci::basket_queue::make_traits< ci::opt::hook< @@ -175,7 +175,7 @@ namespace queue { ci::opt::gc > > - ,co::alignment< co::cache_line_alignment > + ,co::padding< co::cache_line_padding > ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > >::type > BasketQueue_HP_member_cachealign; diff --git a/tests/test-hdr/queue/hdr_intrusive_moirqueue_dhp.cpp b/tests/test-hdr/queue/hdr_intrusive_moirqueue_dhp.cpp index a447573b..64602fe2 100644 --- a/tests/test-hdr/queue/hdr_intrusive_moirqueue_dhp.cpp +++ b/tests/test-hdr/queue/hdr_intrusive_moirqueue_dhp.cpp @@ -86,18 +86,18 @@ namespace queue { >::type > MoirQueue_DHP_member_stat; - // DHP base hook + alignment + // DHP base hook + padding typedef ci::MoirQueue< cds::gc::DHP, base_item_type, typename ci::msqueue::make_traits< ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > , ci::opt::hook< ci::msqueue::base_hook< ci::opt::gc > > - , co::alignment< 32 > + , co::padding< 32 > >::type > MoirQueue_DHP_base_align; - // DHP member hook + alignment + // DHP member hook + padding typedef ci::MoirQueue< cds::gc::DHP, member_item_type, typename ci::msqueue::make_traits< ci::opt::hook< @@ -106,42 +106,42 @@ namespace queue { ci::opt::gc > > - , co::alignment< 32 > + , co::padding< 32 > , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > >::type > MoirQueue_DHP_member_align; - // DHP base hook + no alignment + // DHP base hook + no padding struct traits_MoirQueue_DHP_base_noalign : public ci::msqueue::traits { typedef ci::msqueue::base_hook< ci::opt::gc > hook; typedef IntrusiveQueueHeaderTest::faked_disposer disposer; - enum { alignment = co::no_special_alignment }; + enum { padding = co::no_special_padding }; }; typedef ci::MoirQueue< cds::gc::DHP, base_item_type, traits_MoirQueue_DHP_base_noalign > MoirQueue_DHP_base_noalign; - // DHP member hook + no alignment + // DHP member hook + no padding struct traits_MoirQueue_DHP_member_noalign : public ci::msqueue::traits { typedef ci::msqueue::member_hook < offsetof( member_item_type, hMember ), ci::opt::gc < cds::gc::DHP > > hook; typedef IntrusiveQueueHeaderTest::faked_disposer disposer; - enum { alignment = co::no_special_alignment }; + enum { padding = co::no_special_padding }; }; typedef ci::MoirQueue< cds::gc::DHP, member_item_type, traits_MoirQueue_DHP_member_noalign > MoirQueue_DHP_member_noalign; - // DHP base hook + cache alignment + // DHP base hook + cache padding struct traits_MoirQueue_DHP_base_cachealign : public traits_MoirQueue_DHP_base_noalign { - enum { alignment = co::cache_line_alignment }; + enum { padding = co::cache_line_padding }; }; typedef ci::MoirQueue< cds::gc::DHP, base_item_type, traits_MoirQueue_DHP_base_cachealign > MoirQueue_DHP_base_cachealign; - // DHP member hook + cache alignment + // DHP member hook + cache padding struct traits_MoirQueue_DHP_member_cachealign : public traits_MoirQueue_DHP_member_noalign { - enum { alignment = co::cache_line_alignment }; + enum { padding = co::cache_line_padding }; }; typedef ci::MoirQueue< cds::gc::DHP, member_item_type, traits_MoirQueue_DHP_member_cachealign > MoirQueue_DHP_member_cachealign; } // namespace diff --git a/tests/test-hdr/queue/hdr_intrusive_moirqueue_hp.cpp b/tests/test-hdr/queue/hdr_intrusive_moirqueue_hp.cpp index 7573c28e..8eaa2afd 100644 --- a/tests/test-hdr/queue/hdr_intrusive_moirqueue_hp.cpp +++ b/tests/test-hdr/queue/hdr_intrusive_moirqueue_hp.cpp @@ -109,18 +109,18 @@ namespace queue { >::type > MoirQueue_HP_member_stat; - // HP base hook + alignment + // HP base hook + padding typedef ci::MoirQueue< cds::gc::HP, base_item_type, typename ci::msqueue::make_traits< ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > ,ci::opt::hook< ci::msqueue::base_hook< ci::opt::gc > > - ,co::alignment< 32 > + ,co::padding< 32 > >::type > MoirQueue_HP_base_align; - // HP member hook + alignment + // HP member hook + padding typedef ci::MoirQueue< cds::gc::HP, member_item_type, typename ci::msqueue::make_traits< ci::opt::hook< @@ -129,42 +129,42 @@ namespace queue { ci::opt::gc > > - ,co::alignment< 32 > + ,co::padding< 32 > ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > >::type > MoirQueue_HP_member_align; - // HP base hook + no alignment + // HP base hook + no padding struct traits_MoirQueue_HP_base_noalign : public ci::msqueue::traits { typedef ci::msqueue::base_hook< ci::opt::gc > hook; typedef IntrusiveQueueHeaderTest::faked_disposer disposer; - enum { alignment = co::no_special_alignment }; + enum { padding = co::no_special_padding }; }; typedef ci::MoirQueue< cds::gc::HP, base_item_type, traits_MoirQueue_HP_base_noalign > MoirQueue_HP_base_noalign; - // HP member hook + no alignment + // HP member hook + no padding struct traits_MoirQueue_HP_member_noalign : public ci::msqueue::traits { typedef ci::msqueue::member_hook < offsetof( member_item_type, hMember ), ci::opt::gc < cds::gc::HP > > hook; typedef IntrusiveQueueHeaderTest::faked_disposer disposer; - enum { alignment = co::no_special_alignment }; + enum { padding = co::no_special_padding }; }; typedef ci::MoirQueue< cds::gc::HP, member_item_type, traits_MoirQueue_HP_member_noalign > MoirQueue_HP_member_noalign; - // HP base hook + cache alignment + // HP base hook + cache padding struct traits_MoirQueue_HP_base_cachealign : public traits_MoirQueue_HP_base_noalign { - enum { alignment = co::cache_line_alignment }; + enum { padding = co::cache_line_padding }; }; typedef ci::MoirQueue< cds::gc::HP, base_item_type, traits_MoirQueue_HP_base_cachealign > MoirQueue_HP_base_cachealign; - // HP member hook + cache alignment + // HP member hook + cache padding struct traits_MoirQueue_HP_member_cachealign : public traits_MoirQueue_HP_member_noalign { - enum { alignment = co::cache_line_alignment }; + enum { padding = co::cache_line_padding }; }; typedef ci::MoirQueue< cds::gc::HP, member_item_type, traits_MoirQueue_HP_member_cachealign > MoirQueue_HP_member_cachealign; } diff --git a/tests/test-hdr/queue/hdr_intrusive_msqueue_dhp.cpp b/tests/test-hdr/queue/hdr_intrusive_msqueue_dhp.cpp index 16f8da06..ecf94aa3 100644 --- a/tests/test-hdr/queue/hdr_intrusive_msqueue_dhp.cpp +++ b/tests/test-hdr/queue/hdr_intrusive_msqueue_dhp.cpp @@ -86,18 +86,18 @@ namespace queue { >::type > MSQueue_DHP_member_stat; - // DHP base hook + alignment + // DHP base hook + padding typedef ci::MSQueue< cds::gc::DHP, base_item_type, typename ci::msqueue::make_traits< ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > , ci::opt::hook< ci::msqueue::base_hook< ci::opt::gc > > - , co::alignment< 32 > + , co::padding< 32 > >::type > MSQueue_DHP_base_align; - // DHP member hook + alignment + // DHP member hook + padding typedef ci::MSQueue< cds::gc::DHP, member_item_type, typename ci::msqueue::make_traits< ci::opt::hook< @@ -106,42 +106,42 @@ namespace queue { ci::opt::gc > > - , co::alignment< 32 > + , co::padding< 32 > , ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > >::type > MSQueue_DHP_member_align; - // DHP base hook + no alignment + // DHP base hook + no padding struct traits_MSQueue_DHP_base_noalign : public ci::msqueue::traits { typedef ci::msqueue::base_hook< ci::opt::gc > hook; typedef IntrusiveQueueHeaderTest::faked_disposer disposer; - enum { alignment = co::no_special_alignment }; + enum { padding = co::no_special_padding }; }; typedef ci::MSQueue< cds::gc::DHP, base_item_type, traits_MSQueue_DHP_base_noalign > MSQueue_DHP_base_noalign; - // DHP member hook + no alignment + // DHP member hook + no padding struct traits_MSQueue_DHP_member_noalign : public ci::msqueue::traits { typedef ci::msqueue::member_hook < offsetof( member_item_type, hMember ), ci::opt::gc < cds::gc::DHP > > hook; typedef IntrusiveQueueHeaderTest::faked_disposer disposer; - enum { alignment = co::no_special_alignment }; + enum { padding = co::no_special_padding }; }; typedef ci::MSQueue< cds::gc::DHP, member_item_type, traits_MSQueue_DHP_member_noalign > MSQueue_DHP_member_noalign; - // DHP base hook + cache alignment + // DHP base hook + cache padding struct traits_MSQueue_DHP_base_cachealign : public traits_MSQueue_DHP_base_noalign { - enum { alignment = co::cache_line_alignment }; + enum { padding = co::cache_line_padding }; }; typedef ci::MSQueue< cds::gc::DHP, base_item_type, traits_MSQueue_DHP_base_cachealign > MSQueue_DHP_base_cachealign; - // DHP member hook + cache alignment + // DHP member hook + cache padding struct traits_MSQueue_DHP_member_cachealign : public traits_MSQueue_DHP_member_noalign { - enum { alignment = co::cache_line_alignment }; + enum { padding = co::cache_line_padding }; }; typedef ci::MSQueue< cds::gc::DHP, member_item_type, traits_MSQueue_DHP_member_cachealign > MSQueue_DHP_member_cachealign; } // namespace diff --git a/tests/test-hdr/queue/hdr_intrusive_msqueue_hp.cpp b/tests/test-hdr/queue/hdr_intrusive_msqueue_hp.cpp index 579efdd0..4c47070c 100644 --- a/tests/test-hdr/queue/hdr_intrusive_msqueue_hp.cpp +++ b/tests/test-hdr/queue/hdr_intrusive_msqueue_hp.cpp @@ -110,18 +110,18 @@ namespace queue { >::type > MSQueue_HP_member_stat; - // HP base hook + alignment + // HP base hook + padding typedef ci::MSQueue< cds::gc::HP, base_item_type, typename ci::msqueue::make_traits< ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > ,ci::opt::hook< ci::msqueue::base_hook< ci::opt::gc > > - ,co::alignment< 32 > + ,co::padding< 32 > >::type > MSQueue_HP_base_align; - // HP member hook + alignment + // HP member hook + padding typedef ci::MSQueue< cds::gc::HP, member_item_type, typename ci::msqueue::make_traits< ci::opt::hook< @@ -130,42 +130,42 @@ namespace queue { ci::opt::gc > > - ,co::alignment< 32 > + ,co::padding< 32 > ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > >::type > MSQueue_HP_member_align; - // HP base hook + no alignment + // HP base hook + no padding struct traits_MSQueue_HP_base_noalign : public ci::msqueue::traits { typedef ci::msqueue::base_hook< ci::opt::gc > hook; typedef IntrusiveQueueHeaderTest::faked_disposer disposer; - enum { alignment = co::no_special_alignment }; + enum { padding = co::no_special_padding }; }; typedef ci::MSQueue< cds::gc::HP, base_item_type, traits_MSQueue_HP_base_noalign > MSQueue_HP_base_noalign; - // HP member hook + no alignment + // HP member hook + no padding struct traits_MSQueue_HP_member_noalign : public ci::msqueue::traits { typedef ci::msqueue::member_hook < offsetof( member_item_type, hMember ), ci::opt::gc < cds::gc::HP > > hook; typedef IntrusiveQueueHeaderTest::faked_disposer disposer; - enum { alignment = co::no_special_alignment }; + enum { padding = co::no_special_padding }; }; typedef ci::MSQueue< cds::gc::HP, member_item_type, traits_MSQueue_HP_member_noalign > MSQueue_HP_member_noalign; - // HP base hook + cache alignment + // HP base hook + cache padding struct traits_MSQueue_HP_base_cachealign : public traits_MSQueue_HP_base_noalign { - enum { alignment = co::cache_line_alignment }; + enum { padding = co::cache_line_padding }; }; typedef ci::MSQueue< cds::gc::HP, base_item_type, traits_MSQueue_HP_base_cachealign > MSQueue_HP_base_cachealign; - // HP member hook + cache alignment + // HP member hook + cache padding struct traits_MSQueue_HP_member_cachealign : public traits_MSQueue_HP_member_noalign { - enum { alignment = co::cache_line_alignment }; + enum { padding = co::cache_line_padding }; }; typedef ci::MSQueue< cds::gc::HP, member_item_type, traits_MSQueue_HP_member_cachealign > MSQueue_HP_member_cachealign; diff --git a/tests/test-hdr/queue/hdr_moirqueue_dhp.cpp b/tests/test-hdr/queue/hdr_moirqueue_dhp.cpp index fec72a12..2cbd0128 100644 --- a/tests/test-hdr/queue/hdr_moirqueue_dhp.cpp +++ b/tests/test-hdr/queue/hdr_moirqueue_dhp.cpp @@ -74,7 +74,7 @@ namespace queue { typedef cds::container::MoirQueue < cds::gc::DHP, int, typename cds::container::msqueue::make_traits < cds::opt::memory_model< cds::opt::v::relaxed_ordering> - , cds::opt::alignment < 16 > + , cds::opt::padding < 16 > > ::type > test_queue; @@ -87,7 +87,7 @@ namespace queue { typename cds::container::msqueue::make_traits < cds::opt::item_counter< cds::atomicity::item_counter > , cds::opt::memory_model< cds::opt::v::relaxed_ordering> - , cds::opt::alignment < 32 > + , cds::opt::padding < 32 > >::type > test_queue; @@ -99,7 +99,7 @@ namespace queue { typedef cds::container::MoirQueue < cds::gc::DHP, int, typename cds::container::msqueue::make_traits < cds::opt::memory_model< cds::opt::v::sequential_consistent> - ,cds::opt::alignment < cds::opt::no_special_alignment > + ,cds::opt::padding < cds::opt::no_special_padding > > ::type > test_queue; @@ -112,7 +112,7 @@ namespace queue { typename cds::container::msqueue::make_traits < cds::opt::item_counter< cds::atomicity::item_counter > , cds::opt::memory_model< cds::opt::v::sequential_consistent> - , cds::opt::alignment < cds::opt::cache_line_alignment > + , cds::opt::padding < cds::opt::cache_line_padding > > ::type > test_queue; test_ic< test_queue >(); diff --git a/tests/test-hdr/queue/hdr_moirqueue_hp.cpp b/tests/test-hdr/queue/hdr_moirqueue_hp.cpp index c97b31c3..19b456c6 100644 --- a/tests/test-hdr/queue/hdr_moirqueue_hp.cpp +++ b/tests/test-hdr/queue/hdr_moirqueue_hp.cpp @@ -75,7 +75,7 @@ namespace queue { typedef cds::container::MoirQueue < cds::gc::HP, int, typename cds::container::msqueue::make_traits < cds::opt::memory_model< cds::opt::v::relaxed_ordering> - , cds::opt::alignment < 16 > + , cds::opt::padding < 16 > > ::type > test_queue; @@ -88,7 +88,7 @@ namespace queue { typename cds::container::msqueue::make_traits < cds::opt::item_counter< cds::atomicity::item_counter > , cds::opt::memory_model< cds::opt::v::relaxed_ordering> - , cds::opt::alignment < 32 > + , cds::opt::padding < 32 > >::type > test_queue; @@ -100,7 +100,7 @@ namespace queue { typedef cds::container::MoirQueue < cds::gc::HP, int, typename cds::container::msqueue::make_traits < cds::opt::memory_model< cds::opt::v::sequential_consistent> - ,cds::opt::alignment < cds::opt::no_special_alignment > + ,cds::opt::padding < cds::opt::no_special_padding > > ::type > test_queue; @@ -113,7 +113,7 @@ namespace queue { typename cds::container::msqueue::make_traits < cds::opt::item_counter< cds::atomicity::item_counter > , cds::opt::memory_model< cds::opt::v::sequential_consistent> - , cds::opt::alignment < cds::opt::cache_line_alignment > + , cds::opt::padding < cds::opt::cache_line_padding > > ::type > test_queue; test_ic< test_queue >(); diff --git a/tests/test-hdr/queue/hdr_msqueue_dhp.cpp b/tests/test-hdr/queue/hdr_msqueue_dhp.cpp index e0a91df3..1e915b25 100644 --- a/tests/test-hdr/queue/hdr_msqueue_dhp.cpp +++ b/tests/test-hdr/queue/hdr_msqueue_dhp.cpp @@ -75,7 +75,7 @@ namespace queue { typedef cds::container::MSQueue < cds::gc::DHP, int, typename cds::container::msqueue::make_traits < cds::opt::memory_model< cds::opt::v::relaxed_ordering> - , cds::opt::alignment < 16 > + , cds::opt::padding < 16 > > ::type > test_queue; @@ -88,7 +88,7 @@ namespace queue { typename cds::container::msqueue::make_traits < cds::opt::item_counter< cds::atomicity::item_counter > , cds::opt::memory_model< cds::opt::v::relaxed_ordering> - , cds::opt::alignment < 32 > + , cds::opt::padding < 32 > >::type > test_queue; @@ -100,7 +100,7 @@ namespace queue { typedef cds::container::MSQueue < cds::gc::DHP, int, typename cds::container::msqueue::make_traits < cds::opt::memory_model< cds::opt::v::sequential_consistent> - ,cds::opt::alignment < cds::opt::no_special_alignment > + ,cds::opt::padding < cds::opt::no_special_padding > > ::type > test_queue; @@ -113,7 +113,7 @@ namespace queue { typename cds::container::msqueue::make_traits < cds::opt::item_counter< cds::atomicity::item_counter > , cds::opt::memory_model< cds::opt::v::sequential_consistent> - , cds::opt::alignment < cds::opt::cache_line_alignment > + , cds::opt::padding < cds::opt::cache_line_padding > > ::type > test_queue; test_ic< test_queue >(); diff --git a/tests/test-hdr/queue/hdr_msqueue_hp.cpp b/tests/test-hdr/queue/hdr_msqueue_hp.cpp index 0a9dda4d..5fe4fa68 100644 --- a/tests/test-hdr/queue/hdr_msqueue_hp.cpp +++ b/tests/test-hdr/queue/hdr_msqueue_hp.cpp @@ -75,7 +75,7 @@ namespace queue { typedef cds::container::MSQueue < cds::gc::HP, int, typename cds::container::msqueue::make_traits < cds::opt::memory_model< cds::opt::v::relaxed_ordering> - , cds::opt::alignment < 16 > + , cds::opt::padding < 16 > > ::type > test_queue; @@ -88,7 +88,7 @@ namespace queue { typename cds::container::msqueue::make_traits < cds::opt::item_counter< cds::atomicity::item_counter > , cds::opt::memory_model< cds::opt::v::relaxed_ordering> - , cds::opt::alignment < 32 > + , cds::opt::padding < 32 > >::type > test_queue; @@ -100,7 +100,7 @@ namespace queue { typedef cds::container::MSQueue < cds::gc::HP, int, typename cds::container::msqueue::make_traits < cds::opt::memory_model< cds::opt::v::sequential_consistent> - ,cds::opt::alignment < cds::opt::no_special_alignment > + ,cds::opt::padding < cds::opt::no_special_padding > > ::type > test_queue; @@ -113,7 +113,7 @@ namespace queue { typename cds::container::msqueue::make_traits < cds::opt::item_counter< cds::atomicity::item_counter > , cds::opt::memory_model< cds::opt::v::sequential_consistent> - , cds::opt::alignment < cds::opt::cache_line_alignment > + , cds::opt::padding < cds::opt::cache_line_padding > > ::type > test_queue; test_ic< test_queue >(); diff --git a/tools/tsan-suppression b/tools/tsan-suppression index ba02f0cd..9f5e1565 100644 --- a/tools/tsan-suppression +++ b/tools/tsan-suppression @@ -1,4 +1,8 @@ - - # Boost race [?] in test framework. Do not affect to libcds race:CppUnitMini::ThreadPool::~ThreadPool + +# DHP +race:cds::gc::details::retired_ptr::free + +# uRCU false positive +race:cds::urcu::gc*::batch_retire*