Added wait strategies to flat combining technique
[libcds.git] / test / stress / queue / queue_type.h
index 0db165ec50d24152c3f8fe2b6fa0ae195eafbd1f..c4178fef20214b4fb0bcfe8d6a61b6d6593b54a7 100644 (file)
@@ -52,6 +52,7 @@
 #include <boost/container/deque.hpp>
 
 #include <cds_test/stress_test.h>
+#include <cds_test/stat_flat_combining_out.h>
 #include "print_stat.h"
 
 namespace queue {
@@ -417,12 +418,39 @@ namespace queue {
         typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
 
         // FCQueue
-        class traits_FCQueue_elimination:
+        struct traits_FCQueue_single_mutex_single_condvar:
+            public cds::container::fcqueue::make_traits<
+                cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<>>
+            >::type
+        {};
+        struct traits_FCQueue_single_mutex_single_condvar_stat: traits_FCQueue_single_mutex_single_condvar
+        {
+            typedef cds::container::fcqueue::stat<> stat;
+        };
+        struct traits_FCQueue_single_mutex_multi_condvar:
+            public cds::container::fcqueue::make_traits<
+                cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
+            >::type
+        {};
+        struct traits_FCQueue_single_mutex_multi_condvar_stat: traits_FCQueue_single_mutex_multi_condvar
+        {
+            typedef cds::container::fcqueue::stat<> stat;
+        };
+        struct traits_FCQueue_multi_mutex_multi_condvar:
+            public cds::container::fcqueue::make_traits<
+                cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
+            >::type
+        {};
+        struct traits_FCQueue_multi_mutex_multi_condvar_stat: traits_FCQueue_multi_mutex_multi_condvar
+        {
+            typedef cds::container::fcqueue::stat<> stat;
+        };
+        struct traits_FCQueue_elimination:
             public cds::container::fcqueue::make_traits<
                 cds::opt::enable_elimination< true >
             >::type
         {};
-        class traits_FCQueue_elimination_stat:
+        struct traits_FCQueue_elimination_stat:
             public cds::container::fcqueue::make_traits<
                 cds::opt::enable_elimination< true >
                 ,cds::opt::stat< cds::container::fcqueue::stat<> >
@@ -430,10 +458,24 @@ namespace queue {
         {};
 
         typedef cds::container::FCQueue< Value > FCQueue_deque;
+        typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar> FCQueue_deque_wait_ss;
+        typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_deque_wait_ss_stat;
+        typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_deque_wait_sm;
+        typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_deque_wait_sm_stat;
+        typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_deque_wait_mm;
+        typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_deque_wait_mm_stat;
+
         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
 
-        typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
+        typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >> FCQueue_list;
+        typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar> FCQueue_list_wait_ss;
+        typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_list_wait_ss_stat;
+        typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_list_wait_sm;
+        typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_list_wait_sm_stat;
+        typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_list_wait_mm;
+        typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_list_wait_mm_stat;
+
         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
 
@@ -461,9 +503,40 @@ namespace queue {
             >::type
         {};
 
+        struct traits_FCDeque_wait_ss: cds::container::fcdeque::traits
+        {
+            typedef cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<> wait_strategy;
+        };
+        struct traits_FCDeque_wait_ss_stat: traits_FCDeque_wait_ss
+        {
+            typedef cds::container::fcdeque::stat<> stat;
+        };
+        struct traits_FCDeque_wait_sm: cds::container::fcdeque::traits
+        {
+            typedef cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<> wait_strategy;
+        };
+        struct traits_FCDeque_wait_sm_stat: traits_FCDeque_wait_sm
+        {
+            typedef cds::container::fcdeque::stat<> stat;
+        };
+        struct traits_FCDeque_wait_mm: cds::container::fcdeque::traits
+        {
+            typedef cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<> wait_strategy;
+        };
+        struct traits_FCDeque_wait_mm_stat: traits_FCDeque_wait_mm
+        {
+            typedef cds::container::fcdeque::stat<> stat;
+        };
+
         typedef details::FCDequeL< Value > FCDequeL_default;
         typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
         typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
+        typedef details::FCDequeL< Value, traits_FCDeque_wait_ss > FCDequeL_wait_ss;
+        typedef details::FCDequeL< Value, traits_FCDeque_wait_ss_stat > FCDequeL_wait_ss_stat;
+        typedef details::FCDequeL< Value, traits_FCDeque_wait_sm > FCDequeL_wait_sm;
+        typedef details::FCDequeL< Value, traits_FCDeque_wait_sm_stat > FCDequeL_wait_sm_stat;
+        typedef details::FCDequeL< Value, traits_FCDeque_wait_mm > FCDequeL_wait_mm;
+        typedef details::FCDequeL< Value, traits_FCDeque_wait_mm_stat > FCDequeL_wait_mm_stat;
         typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
         typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
 
@@ -475,6 +548,12 @@ namespace queue {
         typedef details::FCDequeR< Value > FCDequeR_default;
         typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
         typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
+        typedef details::FCDequeR< Value, traits_FCDeque_wait_ss > FCDequeR_wait_ss;
+        typedef details::FCDequeR< Value, traits_FCDeque_wait_ss_stat > FCDequeR_wait_ss_stat;
+        typedef details::FCDequeR< Value, traits_FCDeque_wait_sm > FCDequeR_wait_sm;
+        typedef details::FCDequeR< Value, traits_FCDeque_wait_sm_stat > FCDequeR_wait_sm_stat;
+        typedef details::FCDequeR< Value, traits_FCDeque_wait_mm > FCDequeR_wait_mm;
+        typedef details::FCDequeR< Value, traits_FCDeque_wait_mm_stat > FCDequeR_wait_mm_stat;
         typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
         typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
 
@@ -483,6 +562,7 @@ namespace queue {
         typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
         typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
 
+        // STL
         typedef StdQueue_deque<Value>               StdQueue_deque_Spinlock;
         typedef StdQueue_list<Value>                StdQueue_list_Spinlock;
         typedef StdQueue_deque<Value, std::mutex>   StdQueue_deque_Mutex;
@@ -553,16 +633,7 @@ namespace cds_test {
                 << 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::container::fcqueue::empty_stat const& /*s*/ )
@@ -587,16 +658,7 @@ namespace cds_test {
             << CDSSTRESS_STAT_OUT( s, m_nPopBack )
             << CDSSTRESS_STAT_OUT( s, m_nFailedPopBack )
             << 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);
     }
 
 } // namespace cds_test
@@ -659,9 +721,21 @@ namespace cds_test {
 
 #define CDSSTRESS_FCQueue( test_fixture ) \
     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque ) \
+    CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss ) \
+    CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss_stat ) \
+    CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm ) \
+    CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm_stat ) \
+    CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm ) \
+    CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm_stat ) \
     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination ) \
     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination_stat ) \
     CDSSTRESS_Queue_F( test_fixture, FCQueue_list ) \
+    CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss ) \
+    CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss_stat ) \
+    CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm ) \
+    CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm_stat ) \
+    CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm ) \
+    CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm_stat ) \
     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination ) \
     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination_stat )
 
@@ -669,6 +743,12 @@ namespace cds_test {
     CDSSTRESS_Queue_F( test_fixture, FCDequeL_default ) \
     CDSSTRESS_Queue_F( test_fixture, FCDequeL_mutex ) \
     CDSSTRESS_Queue_F( test_fixture, FCDequeL_stat ) \
+    CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss ) \
+    CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss_stat ) \
+    CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm ) \
+    CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm_stat ) \
+    CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm ) \
+    CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm_stat ) \
     CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination ) \
     CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination_stat ) \
     CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost ) \
@@ -678,6 +758,12 @@ namespace cds_test {
     CDSSTRESS_Queue_F( test_fixture, FCDequeR_default ) \
     CDSSTRESS_Queue_F( test_fixture, FCDequeR_mutex ) \
     CDSSTRESS_Queue_F( test_fixture, FCDequeR_stat ) \
+    CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss ) \
+    CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss_stat ) \
+    CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm ) \
+    CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm_stat ) \
+    CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm ) \
+    CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm_stat ) \
     CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination ) \
     CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination_stat ) \
     CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost ) \