Removed signal_threaded uRCU
[libcds.git] / test / unit / queue / intrusive_fcqueue.cpp
index 189cf0978f2386481ef82833e5e205b96200ae08..fbd74871bcc9562ab65cb38304eeac407c8a1fc8 100644 (file)
@@ -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.
 */
 
 #include <gtest/gtest.h>
@@ -85,19 +85,19 @@ namespace {
             for ( size_t i = 0; i < nSize; ++i )
                 arr[i].nVal = static_cast<int>(i);
 
-            ASSERT_TRUE( q.empty() );
-            ASSERT_EQ( q.size(), 0 );
+            ASSERT_TRUE( q.empty());
+            ASSERT_EQ( q.size(), 0u );
 
             // pop from empty queue
             pv = q.pop();
             ASSERT_TRUE( pv == nullptr );
-            ASSERT_TRUE( q.empty() );
-            ASSERT_EQ( q.size(), 0 );
+            ASSERT_TRUE( q.empty());
+            ASSERT_EQ( q.size(), 0u );
 
             pv = q.dequeue();
             ASSERT_TRUE( pv == nullptr );
-            ASSERT_TRUE( q.empty() );
-            ASSERT_EQ( q.size(), 0 );
+            ASSERT_TRUE( q.empty());
+            ASSERT_EQ( q.size(), 0u );
 
             // push/pop test
             for ( size_t i = 0; i < nSize; ++i ) {
@@ -105,22 +105,22 @@ namespace {
                     q.push( arr[i] );
                 else
                     q.enqueue( arr[i] );
-                ASSERT_FALSE( q.empty() );
+                ASSERT_FALSE( q.empty());
                 ASSERT_EQ( q.size(), i + 1 );
             }
 
             for ( size_t i = 0; i < nSize; ++i ) {
-                ASSERT_FALSE( q.empty() );
+                ASSERT_FALSE( q.empty());
                 ASSERT_EQ( q.size(), nSize - i );
                 if ( i & 1 )
                     pv = q.pop();
                 else
                     pv = q.dequeue();
                 ASSERT_FALSE( pv == nullptr );
-                ASSERT_EQ( pv->nVal, static_cast<int>(i) );
+                ASSERT_EQ( pv->nVal, static_cast<int>(i));
             }
-            ASSERT_TRUE( q.empty() );
-            ASSERT_EQ( q.size(), 0 );
+            ASSERT_TRUE( q.empty());
+            ASSERT_EQ( q.size(), 0u );
 
             // pop() doesn't call disposer
             for ( size_t i = 0; i < nSize; ++i ) {
@@ -131,12 +131,12 @@ namespace {
             for ( size_t i = 0; i < nSize; ++i )
                 q.push( arr[i] );
 
-            ASSERT_FALSE( q.empty() );
+            ASSERT_FALSE( q.empty());
             ASSERT_EQ( q.size(), nSize );
 
             q.clear( true );
-            ASSERT_TRUE( q.empty() );
-            ASSERT_EQ( q.size(), 0 );
+            ASSERT_TRUE( q.empty());
+            ASSERT_EQ( q.size(), 0u );
 
             for ( size_t i = 0; i < nSize; ++i ) {
                 ASSERT_EQ( arr[i].nDisposeCount, 1 );
@@ -147,8 +147,8 @@ namespace {
                 q.push( arr[i] );
 
             q.clear();
-            ASSERT_TRUE( q.empty() );
-            ASSERT_EQ( q.size(), 0 );
+            ASSERT_TRUE( q.empty());
+            ASSERT_EQ( q.size(), 0u );
 
             for ( size_t i = 0; i < nSize; ++i ) {
                 ASSERT_EQ( arr[i].nDisposeCount, 1 );
@@ -169,6 +169,36 @@ namespace {
         test( q );
     }
 
+    TEST_F( IntrusiveFCQueue, base_empty_wait_strategy )
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        struct traits: public cds::intrusive::fcqueue::traits
+        {
+            typedef IntrusiveFCQueue::disposer disposer;
+            typedef cds::algo::flat_combining::wait_strategy::empty wait_strategy;
+            typedef cds::intrusive::fcqueue::stat<> stat;
+        };
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >, traits > queue_type;
+
+        queue_type q;
+        test( q );
+    }
+
+    TEST_F( IntrusiveFCQueue, base_single_mutex_single_condvar )
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        struct traits: public cds::intrusive::fcqueue::traits
+        {
+            typedef IntrusiveFCQueue::disposer disposer;
+            typedef cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<> wait_strategy;
+            typedef cds::intrusive::fcqueue::stat<> stat;
+        };
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >, traits > queue_type;
+
+        queue_type q;
+        test( q );
+    }
+
     TEST_F( IntrusiveFCQueue, base_mutex )
     {
         typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
@@ -184,6 +214,22 @@ namespace {
         test( q );
     }
 
+    TEST_F( IntrusiveFCQueue, base_mutex_single_mutex_multi_condvar )
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        struct traits: public cds::intrusive::fcqueue::traits
+        {
+            typedef IntrusiveFCQueue::disposer disposer;
+            typedef std::mutex lock_type;
+            typedef cds::intrusive::fcqueue::stat<> stat;
+            typedef cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<> wait_strategy;
+        };
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >, traits > queue_type;
+
+        queue_type q;
+        test( q );
+    }
+
     TEST_F( IntrusiveFCQueue, base_elimination )
     {
         typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
@@ -199,6 +245,22 @@ namespace {
         test( q );
     }
 
+    TEST_F( IntrusiveFCQueue, base_elimination_multi_mutex_multi_condvar )
+    {
+        typedef base_hook_item< boost::intrusive::list_base_hook<> > value_type;
+        struct traits: public
+            cds::intrusive::fcqueue::make_traits <
+                cds::intrusive::opt::disposer< disposer >
+                , cds::opt::enable_elimination < true >
+                , cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
+            > ::type
+        {};
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type >, traits > queue_type;
+
+        queue_type q;
+        test( q );
+    }
+
     TEST_F( IntrusiveFCQueue, member )
     {
         typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
@@ -231,6 +293,54 @@ namespace {
         test( q );
     }
 
+    TEST_F( IntrusiveFCQueue, member_empty_wait_strategy )
+    {
+        typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+                , cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::empty >
+            >::type
+        > queue_type;
+
+        queue_type q;
+        test( q );
+    }
+
+    TEST_F( IntrusiveFCQueue, member_single_mutex_single_condvar )
+    {
+        typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+                , cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<2>>
+            >::type
+        > queue_type;
+
+        queue_type q;
+        test( q );
+    }
+
+    TEST_F( IntrusiveFCQueue, member_multi_mutex_multi_condvar )
+    {
+        typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+                , cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
+            >::type
+        > queue_type;
+
+        queue_type q;
+        test( q );
+    }
+
     TEST_F( IntrusiveFCQueue, member_elimination )
     {
         typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
@@ -247,6 +357,23 @@ namespace {
         test( q );
     }
 
+    TEST_F( IntrusiveFCQueue, member_elimination_single_mutex_multi_condvar )
+    {
+        typedef member_hook_item< boost::intrusive::list_member_hook<> > value_type;
+        typedef boost::intrusive::member_hook<value_type, boost::intrusive::list_member_hook<>, &value_type::hMember> member_option;
+
+        typedef cds::intrusive::FCQueue< value_type, boost::intrusive::list< value_type, member_option >,
+            cds::intrusive::fcqueue::make_traits<
+                cds::intrusive::opt::disposer< disposer >
+                ,cds::opt::enable_elimination< true >
+                , cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<2>>
+            >::type
+        > queue_type;
+
+        queue_type q;
+        test( q );
+    }
+
     TEST_F( IntrusiveFCQueue, slist_base )
     {
         typedef base_hook_item< boost::intrusive::slist_base_hook<>> value_type;