#include <vector>
#include <algorithm>
+#include <type_traits>
// Multi-threaded queue push/pop test
namespace {
static size_t s_nConsumerThreadCount = 4;
static size_t s_nProducerThreadCount = 4;
static size_t s_nQueueSize = 4000000;
+ static size_t s_nHeavyValueSize = 100;
static std::atomic<size_t> s_nProducerDone( 0 );
struct old_value
- {
- size_t nNo;
- size_t nWriterNo;
- };
+ {
+ size_t nNo;
+ size_t nWriterNo;
+ };
template<class Value = old_value>
class queue_push_pop: public cds_test::stress_fixture
{
protected:
- using value_type = Value;
+ using value_type = Value;
- enum {
+ enum {
producer_thread,
consumer_thread
};
propout() << q.statistics();
}
+ private:
+ static void set_array_size( size_t size ) {
+ const bool tmp = fc_test::has_set_array_size<value_type>::value;
+ set_array_size(size, std::integral_constant<bool, tmp>());
+ }
+
+ static void set_array_size(size_t size, std::true_type){
+ value_type::set_array_size(size);
+ }
+
+ static void set_array_size(size_t, std::false_type)
+ {
+ }
+
public:
static void SetUpTestCase()
{
s_nConsumerThreadCount = cfg.get_size_t( "ConsumerCount", s_nConsumerThreadCount );
s_nProducerThreadCount = cfg.get_size_t( "ProducerCount", s_nProducerThreadCount );
s_nQueueSize = cfg.get_size_t( "QueueSize", s_nQueueSize );
+ s_nHeavyValueSize = cfg.get_size_t( "HeavyValueSize", s_nHeavyValueSize );
if ( s_nConsumerThreadCount == 0u )
s_nConsumerThreadCount = 1;
s_nProducerThreadCount = 1;
if ( s_nQueueSize == 0u )
s_nQueueSize = 1000;
+ if ( s_nHeavyValueSize == 0 )
+ s_nHeavyValueSize = 1;
+
+ set_array_size( s_nHeavyValueSize );
}
//static void TearDownTestCase();
};
- using value_for_fc_with_heavy_value = queue_push_pop< HeavyValue<36000> >;
+ using value_for_fc_with_heavy_value = queue_push_pop< fc_test::HeavyValue<36000> >;
using old_queue_push_pop = queue_push_pop<>;
-// CDSSTRESS_MSQueue( old_queue_push_pop )
-// CDSSTRESS_MoirQueue( old_queue_push_pop )
-// CDSSTRESS_BasketQueue( old_queue_push_pop )
-// CDSSTRESS_OptimsticQueue( old_queue_push_pop )
-// CDSSTRESS_FCQueue( old_queue_push_pop )
-// CDSSTRESS_FCDeque( old_queue_push_pop )
- CDSSTRESS_FCDeque_HeavyValue( value_for_fc_with_heavy_value )
-// CDSSTRESS_RWQueue( old_queue_push_pop )
-// CDSSTRESS_StdQueue( old_queue_push_pop )
+ CDSSTRESS_MSQueue( old_queue_push_pop )
+ CDSSTRESS_MoirQueue( old_queue_push_pop )
+ CDSSTRESS_BasketQueue( old_queue_push_pop )
+ CDSSTRESS_OptimsticQueue( old_queue_push_pop )
+ CDSSTRESS_FCQueue( old_queue_push_pop )
+ CDSSTRESS_FCDeque( old_queue_push_pop )
+ CDSSTRESS_FCDeque_HeavyValue( value_for_fc_with_heavy_value )
+ CDSSTRESS_RWQueue( old_queue_push_pop )
+ CDSSTRESS_StdQueue( old_queue_push_pop )
#undef CDSSTRESS_Queue_F
#define CDSSTRESS_Queue_F( test_fixture, type_name, level ) \
if ( bIterative && quasi_factor > 4 ) {
for ( size_t qf = 4; qf <= quasi_factor; qf *= 2 )
args.push_back( qf );
- }
- else {
+ } else {
if ( quasi_factor > 2 )
args.push_back( quasi_factor );
else
test< queue_type >(); \
}
-// CDSSTRESS_SegmentedQueue( segmented_queue_push_pop )
+ CDSSTRESS_SegmentedQueue( segmented_queue_push_pop )
INSTANTIATE_TEST_CASE_P( SQ,
segmented_queue_push_pop,
CDSSTRESS_Queue_F( test_fixture, FCQueue_deque, 0 ) \
CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_stat, 0 ) \
CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss, 1 ) \
- CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss_stat, 0 )
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination_stat,0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_list, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_list_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination_stat, 0 )
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination_stat,0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_list, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_list_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination_stat, 0 )
#define CDSSTRESS_FCDeque( test_fixture ) \
CDSSTRESS_Queue_F( test_fixture, FCDequeL_default, 0 ) \
CDSSTRESS_Queue_F( test_fixture, FCDequeL_mutex, 1 ) \
CDSSTRESS_Queue_F( test_fixture, FCDequeL_stat, 1 ) \
- CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss, 1 )
-// CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination_stat, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_default, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_mutex, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_stat, 0 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination, 1 ) \
-// CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination_stat, 1 )
+ CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss, 1 )\
+ CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination_stat, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_default, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_mutex, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_stat, 0 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination, 1 ) \
+ CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination_stat, 1 )
#define CDSSTRESS_FCDeque_HeavyValue( test_fixture ) \
CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_default, 0 ) \
CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_mutex, 0 ) \
CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_stat, 0 ) \
- CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_ss, 1 )
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_ss_stat, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_sm, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_sm_stat, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_mm, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_mm_stat, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_elimination, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_elimination_stat, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_stat, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_elimination, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_elimination_stat, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_default, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_mutex, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_stat, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_ss, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_ss_stat, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_sm, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_sm_stat, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_mm, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_mm_stat, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_elimination, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_elimination_stat, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_stat, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_elimination, 1 ) \
-// CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_elimination_stat, 1 )
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_ss, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_ss_stat, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_sm, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_sm_stat, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_mm, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_mm_stat, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_elimination, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_elimination_stat, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_stat, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_elimination, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_elimination_stat, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_default, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_mutex, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_stat, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_ss, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_ss_stat, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_sm, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_sm_stat, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_mm, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_mm_stat, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_elimination, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_elimination_stat, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_stat, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_elimination, 1 ) \
+ CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_elimination_stat, 1 )
#define CDSSTRESS_RWQueue( test_fixture ) \
CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin, 0 ) \