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:
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 CDSSTRESS_INTRUSIVE_QUEUE_TYPES_H
#include <cds/intrusive/msqueue.h>
#include <cds/intrusive/moir_queue.h>
#include <cds/intrusive/optimistic_queue.h>
-#include <cds/intrusive/tsigas_cycle_queue.h>
#include <cds/intrusive/vyukov_mpmc_cycle_queue.h>
#include <cds/intrusive/basket_queue.h>
#include <cds/intrusive/fcqueue.h>
#include <boost/intrusive/slist.hpp>
#include <cds_test/stress_test.h>
+#include <cds_test/stat_flat_combining_out.h>
#include "print_stat.h"
namespace queue {
value_type * pop()
{
lock_guard l( m_Lock );
- if ( m_List.empty() )
+ if ( m_List.empty())
return nullptr;
value_type& v = m_List.front();
m_List.pop_front();
} // namespace details
template <typename T>
- struct Types
+ struct Types
{
// MSQueue, MoirQueue
struct traits_MSQueue_HP : public cds::intrusive::msqueue::traits
{};
typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_stat > OptimisticQueue_DHP_stat;
- // TsigasCycleQueue
- class TsigasCycleQueue_dyn
- : public cds::intrusive::TsigasCycleQueue< T,
- typename cds::intrusive::tsigas_queue::make_traits<
- cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
- >::type
- >
- {
- typedef cds::intrusive::TsigasCycleQueue< T,
- typename cds::intrusive::tsigas_queue::make_traits<
- cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
- >::type
- > base_class;
- public:
- TsigasCycleQueue_dyn()
- : base_class( 1024 * 64 )
- {}
-
- TsigasCycleQueue_dyn( size_t nCapacity )
- : base_class( nCapacity )
- {}
-
- cds::opt::none statistics() const
- {
- return cds::opt::none();
- }
- };
-
- class TsigasCycleQueue_dyn_ic
- : public cds::intrusive::TsigasCycleQueue< T,
- typename cds::intrusive::tsigas_queue::make_traits<
- cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
- ,cds::opt::item_counter< cds::atomicity::item_counter >
- >::type
- >
- {
- typedef cds::intrusive::TsigasCycleQueue< T,
- typename cds::intrusive::tsigas_queue::make_traits<
- cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
- ,cds::opt::item_counter< cds::atomicity::item_counter >
- >::type
- > base_class;
- public:
- TsigasCycleQueue_dyn_ic()
- : base_class( 1024 * 64 )
- {}
- TsigasCycleQueue_dyn_ic( size_t nCapacity )
- : base_class( nCapacity )
- {}
-
- cds::opt::none statistics() const
- {
- return cds::opt::none();
- }
- };
-
// VyukovMPMCCycleQueue
struct traits_VyukovMPMCCycleQueue_dyn : public cds::intrusive::vyukov_queue::traits
{
- typedef cds::opt::v::dynamic_buffer< int > buffer;
+ typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
};
class VyukovMPMCCycleQueue_dyn
: public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn >
// FCQueue
class traits_FCQueue_delay2:
public cds::intrusive::fcqueue::make_traits<
- cds::opt::back_off< cds::backoff::delay_of<2> >
+ cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::backoff< cds::backoff::delay_of<2>>>
>::type
{};
class traits_FCQueue_delay2_elimination:
public cds::intrusive::fcqueue::make_traits<
- cds::opt::back_off< cds::backoff::delay_of<2> >
+ cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::backoff< cds::backoff::delay_of<2>>>
,cds::opt::enable_elimination< true >
>::type
{};
class traits_FCQueue_delay2_elimination_stat:
public cds::intrusive::fcqueue::make_traits<
- cds::opt::back_off< cds::backoff::delay_of<2> >
+ cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::backoff< cds::backoff::delay_of<2>>>
,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
,cds::opt::enable_elimination< true >
>::type
>::type
{};
+ class traits_FCQueue_wait_ss:
+ public cds::intrusive::fcqueue::make_traits<
+ cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<>>
+ >::type
+ {};
+ struct traits_FCQueue_wait_ss_stat: traits_FCQueue_wait_ss
+ {
+ typedef cds::intrusive::fcqueue::stat<> stat;
+ };
+ class traits_FCQueue_wait_sm:
+ public cds::intrusive::fcqueue::make_traits<
+ cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
+ >::type
+ {};
+ struct traits_FCQueue_wait_sm_stat: traits_FCQueue_wait_sm
+ {
+ typedef cds::intrusive::fcqueue::stat<> stat;
+ };
+ class traits_FCQueue_wait_mm:
+ public cds::intrusive::fcqueue::make_traits<
+ cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
+ >::type
+ {};
+ struct traits_FCQueue_wait_mm_stat: traits_FCQueue_wait_mm
+ {
+ typedef cds::intrusive::fcqueue::stat<> stat;
+ };
+
typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
+ typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_ss > FCQueue_list_wait_ss;
+ typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_ss_stat > FCQueue_list_wait_ss_stat;
+ typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_sm > FCQueue_list_wait_sm;
+ typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_sm_stat > FCQueue_list_wait_sm_stat;
+ typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_mm > FCQueue_list_wait_mm;
+ typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_mm_stat > FCQueue_list_wait_mm_stat;
// SegmentedQueue
class traits_SegmentedQueue_spin_stat:
<< CDSSTRESS_STAT_OUT( s, m_nDequeue )
<< CDSSTRESS_STAT_OUT( s, m_nFailedDeq )
<< CDSSTRESS_STAT_OUT( s, m_nCollided )
- << CDSSTRESS_STAT_OUT_( "combining_factor", s.combining_factor() )
- << CDSSTRESS_STAT_OUT( s, m_nOperationCount )
- << CDSSTRESS_STAT_OUT( s, m_nCombiningCount )
- << CDSSTRESS_STAT_OUT( s, m_nCompactPublicationList )
- << CDSSTRESS_STAT_OUT( s, m_nDeactivatePubRecord )
- << CDSSTRESS_STAT_OUT( s, m_nActivatePubRecord )
- << CDSSTRESS_STAT_OUT( s, m_nPubRecordCreated )
- << CDSSTRESS_STAT_OUT( s, m_nPubRecordDeteted )
- << CDSSTRESS_STAT_OUT( s, m_nAcquirePubRecCount )
- << CDSSTRESS_STAT_OUT( s, m_nReleasePubRecCount );
+ << static_cast<cds::algo::flat_combining::stat<> const&>(s);
}
static inline property_stream& operator <<( property_stream& o, cds::intrusive::fcqueue::empty_stat const& /*s*/ )