X-Git-Url: http://plrg.eecs.uci.edu/git/?p=libcds.git;a=blobdiff_plain;f=cds%2Fcontainer%2Ffcstack.h;h=8641ff7f7fcf3c6a86767f646aa380745edd8d50;hp=eb7c8de513e99abe743e272f2142065c0d3b7a6b;hb=1132246d5685f87a5b240e077b7e88d56e38b1ff;hpb=7448008aa977fe42a83738fbbc63ce11d8ab86f9 diff --git a/cds/container/fcstack.h b/cds/container/fcstack.h index eb7c8de5..8641ff7f 100644 --- a/cds/container/fcstack.h +++ b/cds/container/fcstack.h @@ -1,11 +1,11 @@ /* This file is a part of libcds - Concurrent Data Structures library - (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016 + (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017 Source code repo: http://github.com/khizmax/libcds/ Download: http://sourceforge.net/projects/libcds/files/ - + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -25,7 +25,7 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef CDSLIB_CONTAINER_FCSTACK_H @@ -84,13 +84,8 @@ namespace cds { namespace container { /// Metafunction converting option list to traits /** \p Options are: - - \p opt::lock_type - mutex type, default is \p cds::sync::spin - - \p opt::back_off - back-off strategy, defalt is \p cds::backoff::Default - - \p opt::allocator - allocator type, default is \ref CDS_DEFAULT_ALLOCATOR + - any \p cds::algo::flat_combining::make_traits options - \p opt::stat - internal statistics, possible type: \p fcstack::stat, \p fcstack::empty_stat (the default) - - \p opt::memory_model - C++ memory ordering model. - List of all available memory ordering see \p opt::memory_model. - Default is \p cds::opt::v:relaxed_ordering - \p opt::enable_elimination - enable/disable operation \ref cds_elimination_description "elimination" By default, the elimination is disabled. */ @@ -165,8 +160,8 @@ namespace cds { namespace container { protected: //@cond - fc_kernel m_FlatCombining; - stack_type m_Stack; + mutable fc_kernel m_FlatCombining; + stack_type m_Stack; //@endcond public: @@ -188,7 +183,7 @@ namespace cds { namespace container { */ bool push( value_type const& val ) { - fc_record * pRec = m_FlatCombining.acquire_record(); + auto pRec = m_FlatCombining.acquire_record(); pRec->pValPush = &val; if ( c_bEliminationEnabled ) @@ -196,7 +191,7 @@ namespace cds { namespace container { else m_FlatCombining.combine( op_push, pRec, *this ); - assert( pRec->is_done() ); + assert( pRec->is_done()); m_FlatCombining.release_record( pRec ); m_FlatCombining.internal_statistics().onPush(); return true; @@ -208,7 +203,7 @@ namespace cds { namespace container { */ bool push( value_type&& val ) { - fc_record * pRec = m_FlatCombining.acquire_record(); + auto pRec = m_FlatCombining.acquire_record(); pRec->pValPush = &val; if ( c_bEliminationEnabled ) @@ -216,7 +211,7 @@ namespace cds { namespace container { else m_FlatCombining.combine( op_push_move, pRec, *this ); - assert( pRec->is_done() ); + assert( pRec->is_done()); m_FlatCombining.release_record( pRec ); m_FlatCombining.internal_statistics().onPushMove(); @@ -229,7 +224,7 @@ namespace cds { namespace container { */ bool pop( value_type& val ) { - fc_record * pRec = m_FlatCombining.acquire_record(); + auto pRec = m_FlatCombining.acquire_record(); pRec->pValPop = &val; if ( c_bEliminationEnabled ) @@ -237,7 +232,7 @@ namespace cds { namespace container { else m_FlatCombining.combine( op_pop, pRec, *this ); - assert( pRec->is_done() ); + assert( pRec->is_done()); m_FlatCombining.release_record( pRec ); m_FlatCombining.internal_statistics().onPop( pRec->bEmpty ); @@ -247,14 +242,14 @@ namespace cds { namespace container { /// Clears the stack void clear() { - fc_record * pRec = m_FlatCombining.acquire_record(); + auto pRec = m_FlatCombining.acquire_record(); if ( c_bEliminationEnabled ) m_FlatCombining.batch_combine( op_clear, pRec, *this ); else m_FlatCombining.combine( op_clear, pRec, *this ); - assert( pRec->is_done() ); + assert( pRec->is_done()); m_FlatCombining.release_record( pRec ); } @@ -275,14 +270,14 @@ namespace cds { namespace container { */ bool empty() { - fc_record * pRec = m_FlatCombining.acquire_record(); + auto pRec = m_FlatCombining.acquire_record(); if ( c_bEliminationEnabled ) m_FlatCombining.batch_combine( op_empty, pRec, *this ); else m_FlatCombining.combine( op_empty, pRec, *this ); - assert( pRec->is_done() ); + assert( pRec->is_done()); m_FlatCombining.release_record( pRec ); return pRec->bEmpty; } @@ -306,16 +301,14 @@ namespace cds { namespace container { { assert( pRec ); - // this function is called under FC mutex, so switch TSan off - CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN; - switch ( pRec->op() ) { + switch ( pRec->op()) { case op_push: assert( pRec->pValPush ); - m_Stack.push( *(pRec->pValPush ) ); + m_Stack.push( *(pRec->pValPush )); break; case op_push_move: assert( pRec->pValPush ); - m_Stack.push( std::move( *(pRec->pValPush )) ); + m_Stack.push( std::move( *(pRec->pValPush ))); break; case op_pop: assert( pRec->pValPop ); @@ -326,7 +319,7 @@ namespace cds { namespace container { } break; case op_clear: - while ( !m_Stack.empty() ) + while ( !m_Stack.empty()) m_Stack.pop(); break; case op_empty: @@ -336,18 +329,14 @@ namespace cds { namespace container { assert(false); break; } - CDS_TSAN_ANNOTATE_IGNORE_RW_END; } /// Batch-processing flat combining void fc_process( typename fc_kernel::iterator itBegin, typename fc_kernel::iterator itEnd ) { - // this function is called under FC mutex, so switch TSan off - CDS_TSAN_ANNOTATE_IGNORE_RW_BEGIN; - typedef typename fc_kernel::iterator fc_iterator; for ( fc_iterator it = itBegin, itPrev = itEnd; it != itEnd; ++it ) { - switch ( it->op() ) { + switch ( it->op( atomics::memory_order_acquire )) { case op_push: case op_push_move: case op_pop: @@ -358,7 +347,6 @@ namespace cds { namespace container { break; } } - CDS_TSAN_ANNOTATE_IGNORE_RW_END; } //@endcond @@ -366,7 +354,7 @@ namespace cds { namespace container { //@cond bool collide( fc_record& rec1, fc_record& rec2 ) { - switch ( rec1.op() ) { + switch ( rec1.op()) { case op_push: if ( rec2.op() == op_pop ) { assert(rec1.pValPush); @@ -386,7 +374,7 @@ namespace cds { namespace container { } break; case op_pop: - switch ( rec2.op() ) { + switch ( rec2.op()) { case op_push: case op_push_move: return collide( rec2, rec1 );