Rearranged queue tests
authorkhizmax <libcds.dev@gmail.com>
Sun, 22 Nov 2015 18:51:29 +0000 (21:51 +0300)
committerkhizmax <libcds.dev@gmail.com>
Sun, 22 Nov 2015 18:51:29 +0000 (21:51 +0300)
tests/unit/queue/bounded_queue_fulness.cpp
tests/unit/queue/queue_defs.h
tests/unit/queue/queue_type.h

index 9222aaf88d0f5f8479481eb7a0c0b44b0b12e1ce..6dd17cfb97d787d5d3d55c3c5bacb036538ad047 100644 (file)
@@ -21,6 +21,52 @@ namespace queue {
     }
     using namespace ns_BoundedQueue_Fullness;
 
+    class VyukovMPMCCycleQueue_dyn_fair_ : public Types<size_t>::VyukovMPMCCycleQueue_dyn_ic
+    {
+        typedef Types<size_t>::VyukovMPMCCycleQueue_dyn_ic base_class;
+    public:
+        typedef base_class::value_type value_type;
+
+        VyukovMPMCCycleQueue_dyn_fair_()
+            : base_class()
+        {}
+
+        VyukovMPMCCycleQueue_dyn_fair_( size_t nCapacity )
+            : base_class( nCapacity )
+        {}
+
+        bool enqueue( value_type const& data )
+        {
+            bool ret;
+            do {
+                ret = base_class::enqueue( data );
+            } while ( !ret && size() != capacity() );
+            return ret;
+        }
+
+        bool push( value_type const& data )
+        {
+            return enqueue( data );
+        }
+
+        bool dequeue( value_type& dest )
+        {
+            bool ret;
+            do {
+                ret = base_class::dequeue( dest );
+            } while ( !ret && size() != capacity() );
+            return ret;
+        }
+
+        bool pop( value_type& dest )
+        {
+            return dequeue( dest );
+        }
+
+        size_t size() const { return base_class::size(); }
+        size_t capacity() const { return base_class::capacity(); }
+    };
+
     class BoundedQueue_Fullness: public CppUnitMini::TestCase
     {
         template <class Queue>
@@ -100,7 +146,7 @@ namespace queue {
         template <class Queue>
         void test()
         {
-            Queue testQueue;
+            Queue testQueue( s_nQueueSize );
 
             CppUnitMini::ThreadPool pool( *this );
             pool.add( new Thread<Queue>( pool, testQueue ), s_nThreadCount );
@@ -109,69 +155,14 @@ namespace queue {
             for ( size_t i = 0; i < nSize; ++i )
                 testQueue.push( i );
 
-            CPPUNIT_MSG( "   Thread count=" << s_nThreadCount << " ...");
-            pool.run();
-
-            analyze( pool, testQueue );
-
-            CPPUNIT_MSG( testQueue.statistics() );
-        }
-
-        template <class Queue>
-        void test_bounded()
-        {
-            size_t nStart = 0;
-            size_t nThreadItemCount = s_nQueueSize / s_nThreadCount;
-
-            Queue testQueue( s_nQueueSize );
-
-            CppUnitMini::ThreadPool pool( *this );
-            pool.add( new Thread<Queue>( pool, testQueue ), s_nThreadCount );
-
-            for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
-                Thread<Queue> * pThread = reinterpret_cast<Thread<Queue> *>(*it);
-                pThread->m_nStartItem = nStart;
-                nStart += nThreadItemCount;
-                pThread->m_nEndItem = nStart;
-            }
-
-            CPPUNIT_MSG( "   Push test, thread count=" << s_nThreadCount << " ...");
+            CPPUNIT_MSG( "   Thread count=" << s_nThreadCount << ", push/pop pairs=" << s_nPassCount 
+                         << ", queue capacity=" << testQueue.capacity() << " ...");
             pool.run();
 
             analyze( pool, testQueue );
 
             CPPUNIT_MSG( testQueue.statistics() );
         }
-
-        template <class Queue>
-        void test_segmented()
-        {
-            CPPUNIT_MSG( "   Push test, thread count=" << s_nThreadCount << " ...");
-            for ( size_t nSegmentSize = 4; nSegmentSize <= 256; nSegmentSize *= 4 ) {
-                CPPUNIT_MSG( "Segment size: " << nSegmentSize );
-
-                Queue testQueue( nSegmentSize );
-
-                CppUnitMini::ThreadPool pool( *this );
-                pool.add( new Thread<Queue>( pool, testQueue ), s_nThreadCount );
-
-                size_t nStart = 0;
-                size_t nThreadItemCount = s_nQueueSize / s_nThreadCount;
-                for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
-                    Thread<Queue> * pThread = reinterpret_cast<Thread<Queue> *>(*it);
-                    pThread->m_nStartItem = nStart;
-                    nStart += nThreadItemCount;
-                    pThread->m_nEndItem = nStart;
-                }
-
-                pool.run();
-
-                analyze( pool, testQueue );
-
-                CPPUNIT_MSG( testQueue.statistics() );
-            }
-        }
-
         void setUpParams( const CppUnitMini::TestCfg& cfg ) {
             s_nThreadCount = cfg.getULong("ThreadCount", 8 );
             s_nQueueSize = cfg.getULong("QueueSize", 1024 );
@@ -181,10 +172,15 @@ namespace queue {
     protected:
         CDSUNIT_DECLARE_TsigasCycleQueue( size_t )
         CDSUNIT_DECLARE_VyukovMPMCCycleQueue( size_t )
+        void VyukovMPMCCycleQueue_dyn_fair()
+        {
+            test< VyukovMPMCCycleQueue_dyn_fair_ >();
+        }
 
         CPPUNIT_TEST_SUITE( BoundedQueue_Fullness )
             CDSUNIT_TEST_TsigasCycleQueue
             CDSUNIT_TEST_VyukovMPMCCycleQueue
+            CPPUNIT_TEST( VyukovMPMCCycleQueue_dyn_fair_ ) \
         CPPUNIT_TEST_SUITE_END();
     };
 
index c5e560f550abe3523da2c2f4fde7286823aa3e7a..02121091010c2a304009b5f36a2cb9825d9ab279 100644 (file)
 #define CDSUNIT_DECLARE_VyukovMPMCCycleQueue( ITEM_TYPE ) \
     TEST_BOUNDED(VyukovMPMCCycleQueue_dyn, ITEM_TYPE) \
     TEST_BOUNDED(VyukovMPMCCycleQueue_dyn_michaelAlloc, ITEM_TYPE) \
-    TEST_BOUNDED(VyukovMPMCCycleQueue_dyn_ic, ITEM_TYPE)
+    TEST_BOUNDED(VyukovMPMCCycleQueue_dyn_ic, ITEM_TYPE) \
+
 
 #define CDSUNIT_TEST_VyukovMPMCCycleQueue \
     CPPUNIT_TEST(VyukovMPMCCycleQueue_dyn) \
     CPPUNIT_TEST(VyukovMPMCCycleQueue_dyn_michaelAlloc) \
-    CPPUNIT_TEST(VyukovMPMCCycleQueue_dyn_ic)
+    CPPUNIT_TEST(VyukovMPMCCycleQueue_dyn_ic) \
 
 // SegmentedQueue
 #define CDSUNIT_DECLARE_SegmentedQueue( ITEM_TYPE ) \
index 37dae5f16290f20e70864983b94bae45e074cd5e..b5709b06b786d08f8ab59e797ecd743629a84f64 100644 (file)
@@ -334,6 +334,7 @@ namespace queue {
             }
         };
 
+
         // BasketQueue
 
         typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;