$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r85854 - in trunk: boost/thread libs/thread/test/sync/mutual_exclusion/sync_bounded_queue libs/thread/test/sync/mutual_exclusion/sync_queue
From: vicente.botet_at_[hidden]
Date: 2013-09-23 12:44:26
Author: viboes
Date: 2013-09-23 12:44:26 EDT (Mon, 23 Sep 2013)
New Revision: 85854
URL: http://svn.boost.org/trac/boost/changeset/85854
Log:
Thread: fix some move semantic issues on sync_queue and sync_bounded_queue and add tests.
Text files modified: 
   trunk/boost/thread/sync_bounded_queue.hpp                                              |    12 +-                                      
   trunk/boost/thread/sync_queue.hpp                                                      |     8 +-                                      
   trunk/libs/thread/test/sync/mutual_exclusion/sync_bounded_queue/single_thread_pass.cpp |    53 +++++++++++++                           
   trunk/libs/thread/test/sync/mutual_exclusion/sync_queue/single_thread_pass.cpp         |   153 ++++++++++++++++++++++++++++++++++++++- 
   4 files changed, 213 insertions(+), 13 deletions(-)
Modified: trunk/boost/thread/sync_bounded_queue.hpp
==============================================================================
--- trunk/boost/thread/sync_bounded_queue.hpp	Mon Sep 23 11:30:22 2013	(r85853)
+++ trunk/boost/thread/sync_bounded_queue.hpp	2013-09-23 12:44:26 EDT (Mon, 23 Sep 2013)	(r85854)
@@ -31,7 +31,9 @@
   struct no_block_tag{};
   BOOST_CONSTEXPR_OR_CONST no_block_tag no_block = {};
 
-  struct sync_queue_is_closed : std::exception {};
+  struct sync_queue_is_closed : std::exception
+  {
+  };
 
   template <typename ValueType>
   class sync_bounded_queue
@@ -529,7 +531,7 @@
     try
     {
       unique_lock<mutex> lk(mtx_);
-      return try_push(elem, lk);
+      return try_push(boost::move(elem), lk);
     }
     catch (...)
     {
@@ -548,7 +550,7 @@
       {
         return false;
       }
-      return try_push(elem, lk);
+      return try_push(boost::move(elem), lk);
     }
     catch (...)
     {
@@ -563,7 +565,7 @@
     try
     {
       unique_lock<mutex> lk(mtx_);
-      push_at(elem, wait_until_not_full(lk), lk);
+      push_at(boost::move(elem), wait_until_not_full(lk), lk);
     }
     catch (...)
     {
@@ -575,7 +577,7 @@
   template <typename ValueType>
   sync_bounded_queue<ValueType>& operator<<(sync_bounded_queue<ValueType>& sbq, BOOST_THREAD_RV_REF(ValueType) elem)
   {
-    sbq.push(boost::forward<ValueType>(elem));
+    sbq.push(boost::move(elem));
     return sbq;
   }
 
Modified: trunk/boost/thread/sync_queue.hpp
==============================================================================
--- trunk/boost/thread/sync_queue.hpp	Mon Sep 23 11:30:22 2013	(r85853)
+++ trunk/boost/thread/sync_queue.hpp	2013-09-23 12:44:26 EDT (Mon, 23 Sep 2013)	(r85854)
@@ -432,7 +432,7 @@
   bool sync_queue<ValueType>::try_push(BOOST_THREAD_RV_REF(ValueType) elem, unique_lock<mutex>& lk)
   {
     throw_if_closed(lk);
-    push(boost::forward<ValueType>(elem), lk);
+    push(boost::move(elem), lk);
     return true;
   }
 
@@ -442,7 +442,7 @@
     try
     {
       unique_lock<mutex> lk(mtx_);
-      return try_push(boost::forward<ValueType>(elem), lk);
+      return try_push(boost::move(elem), lk);
     }
     catch (...)
     {
@@ -461,7 +461,7 @@
       {
         return false;
       }
-      return try_push(boost::forward<ValueType>(elem), lk);
+      return try_push(boost::move(elem), lk);
     }
     catch (...)
     {
@@ -489,7 +489,7 @@
   template <typename ValueType>
   sync_queue<ValueType>& operator<<(sync_queue<ValueType>& sbq, BOOST_THREAD_RV_REF(ValueType) elem)
   {
-    sbq.push(boost::forward<ValueType>(elem));
+    sbq.push(boost::move(elem));
     return sbq;
   }
 
Modified: trunk/libs/thread/test/sync/mutual_exclusion/sync_bounded_queue/single_thread_pass.cpp
==============================================================================
--- trunk/libs/thread/test/sync/mutual_exclusion/sync_bounded_queue/single_thread_pass.cpp	Mon Sep 23 11:30:22 2013	(r85853)
+++ trunk/libs/thread/test/sync/mutual_exclusion/sync_bounded_queue/single_thread_pass.cpp	2013-09-23 12:44:26 EDT (Mon, 23 Sep 2013)	(r85854)
@@ -15,6 +15,16 @@
 
 #include <boost/detail/lightweight_test.hpp>
 
+class non_copyable
+{
+   BOOST_THREAD_MOVABLE_ONLY(non_copyable)
+
+   public:
+   non_copyable(){}
+   non_copyable(BOOST_RV_REF(non_copyable)) {}
+   non_copyable& operator=(BOOST_RV_REF(non_copyable)) { return *this; }
+};
+
 int main()
 {
 
@@ -57,6 +67,16 @@
   }
   {
     // empty queue push rvalue succeeds
+      boost::sync_bounded_queue<non_copyable> q(2);
+      non_copyable nc;
+      q.push(boost::move(nc));
+      BOOST_TEST(! q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 1u);
+      BOOST_TEST(! q.closed());
+  }
+  {
+    // empty queue push rvalue succeeds
       boost::sync_bounded_queue<int> q(2);
       q.push(1);
       q.push(2);
@@ -85,6 +105,16 @@
       BOOST_TEST(! q.closed());
   }
   {
+    // empty queue try_push rvalue succeeds
+      boost::sync_bounded_queue<non_copyable> q(2);
+      non_copyable nc;
+      BOOST_TEST(q.try_push(boost::move(nc)));
+      BOOST_TEST(! q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 1u);
+      BOOST_TEST(! q.closed());
+  }
+  {
     // empty queue try_push value succeeds
       boost::sync_bounded_queue<int> q(2);
       int i;
@@ -104,6 +134,16 @@
       BOOST_TEST(! q.closed());
   }
   {
+    // empty queue try_push rvalue succeeds
+      boost::sync_bounded_queue<non_copyable> q(2);
+      non_copyable nc;
+      BOOST_TEST(q.try_push(boost::no_block, boost::move(nc)));
+      BOOST_TEST(! q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 1u);
+      BOOST_TEST(! q.closed());
+  }
+  {
     // 1-element queue pull succeed
       boost::sync_bounded_queue<int> q(2);
       q.push(1);
@@ -117,6 +157,19 @@
   }
   {
     // 1-element queue pull succeed
+      boost::sync_bounded_queue<non_copyable> q(2);
+      non_copyable nc;
+      q.push(boost::move(nc));
+      non_copyable nc2;
+      q.pull(nc2);
+      //BOOST_TEST_EQ(nc, nc2, 1);
+      BOOST_TEST(q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 0u);
+      BOOST_TEST(! q.closed());
+  }
+  {
+    // 1-element queue pull succeed
       boost::sync_bounded_queue<int> q(2);
       q.push(1);
       int i = q.pull();
Modified: trunk/libs/thread/test/sync/mutual_exclusion/sync_queue/single_thread_pass.cpp
==============================================================================
--- trunk/libs/thread/test/sync/mutual_exclusion/sync_queue/single_thread_pass.cpp	Mon Sep 23 11:30:22 2013	(r85853)
+++ trunk/libs/thread/test/sync/mutual_exclusion/sync_queue/single_thread_pass.cpp	2013-09-23 12:44:26 EDT (Mon, 23 Sep 2013)	(r85854)
@@ -15,6 +15,16 @@
 
 #include <boost/detail/lightweight_test.hpp>
 
+class non_copyable
+{
+   BOOST_THREAD_MOVABLE_ONLY(non_copyable)
+
+   public:
+   non_copyable(){}
+   non_copyable(BOOST_RV_REF(non_copyable)) {}
+   non_copyable& operator=(BOOST_RV_REF(non_copyable)) { return *this; }
+};
+
 int main()
 {
 
@@ -46,7 +56,7 @@
       BOOST_TEST(! q.closed());
   }
   {
-    // empty queue push rvalue succeeds
+    // empty queue push rvalue/copyable succeeds
       boost::sync_queue<int> q;
       q.push(1);
       BOOST_TEST(! q.empty());
@@ -55,6 +65,38 @@
       BOOST_TEST(! q.closed());
   }
   {
+    // empty queue push lvalue/copyable succeeds
+      boost::sync_queue<int> q;
+      int i;
+      q.push(i);
+      BOOST_TEST(! q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 1u);
+      BOOST_TEST(! q.closed());
+  }
+#if 0
+  {
+    // empty queue push rvalue/non_copyable succeeds
+      boost::sync_queue<non_copyable> q;
+      q.push(non_copyable());
+      BOOST_TEST(! q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 1u);
+      BOOST_TEST(! q.closed());
+  }
+#endif
+  {
+    // empty queue push rvalue/non_copyable succeeds
+      boost::sync_queue<non_copyable> q;
+      non_copyable nc;
+      q.push(boost::move(nc));
+      BOOST_TEST(! q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 1u);
+      BOOST_TEST(! q.closed());
+  }
+
+  {
     // empty queue push rvalue succeeds
       boost::sync_queue<int> q;
       q.push(1);
@@ -65,7 +107,7 @@
       BOOST_TEST(! q.closed());
   }
   {
-    // empty queue push value succeeds
+    // empty queue push lvalue succeeds
       boost::sync_queue<int> q;
       int i;
       q.push(i);
@@ -75,7 +117,16 @@
       BOOST_TEST(! q.closed());
   }
   {
-    // empty queue try_push rvalue succeeds
+    // empty queue try_push rvalue/copyable succeeds
+      boost::sync_queue<int> q;
+      BOOST_TEST(q.try_push(1));
+      BOOST_TEST(! q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 1u);
+      BOOST_TEST(! q.closed());
+  }
+  {
+    // empty queue try_push rvalue/copyable succeeds
       boost::sync_queue<int> q;
       BOOST_TEST(q.try_push(1));
       BOOST_TEST(! q.empty());
@@ -83,8 +134,30 @@
       BOOST_TEST_EQ(q.size(), 1u);
       BOOST_TEST(! q.closed());
   }
+#if 0
+  {
+    // empty queue try_push rvalue/non-copyable succeeds
+      boost::sync_queue<non_copyable> q;
+      BOOST_TEST(q.try_push(non_copyable()));
+      BOOST_TEST(! q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 1u);
+      BOOST_TEST(! q.closed());
+  }
+#endif
+  {
+    // empty queue try_push rvalue/non-copyable succeeds
+      boost::sync_queue<non_copyable> q;
+      non_copyable nc;
+      BOOST_TEST(q.try_push(boost::move(nc)));
+      BOOST_TEST(! q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 1u);
+      BOOST_TEST(! q.closed());
+  }
+
   {
-    // empty queue try_push value succeeds
+    // empty queue try_push lvalue succeeds
       boost::sync_queue<int> q;
       int i;
       BOOST_TEST(q.try_push(i));
@@ -102,6 +175,27 @@
       BOOST_TEST_EQ(q.size(), 1u);
       BOOST_TEST(! q.closed());
   }
+#if 0
+  {
+    // empty queue try_push rvalue/non-copyable succeeds
+      boost::sync_queue<non_copyable> q;
+      BOOST_TEST(q.try_push(boost::no_block, non_copyable()));
+      BOOST_TEST(! q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 1u);
+      BOOST_TEST(! q.closed());
+  }
+#endif
+  {
+    // empty queue try_push rvalue/non-copyable succeeds
+      boost::sync_queue<non_copyable> q;
+      non_copyable nc;
+      BOOST_TEST(q.try_push(boost::no_block, boost::move(nc)));
+      BOOST_TEST(! q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 1u);
+      BOOST_TEST(! q.closed());
+  }
   {
     // 1-element queue pull succeed
       boost::sync_queue<int> q;
@@ -116,6 +210,19 @@
   }
   {
     // 1-element queue pull succeed
+      boost::sync_queue<non_copyable> q;
+      non_copyable nc1;
+      q.push(boost::move(nc1));
+      non_copyable nc2;
+      q.pull(nc2);
+      //BOOST_TEST_EQ(nc1, nc2);
+      BOOST_TEST(q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 0u);
+      BOOST_TEST(! q.closed());
+  }
+  {
+    // 1-element queue pull succeed
       boost::sync_queue<int> q;
       q.push(1);
       int i = q.pull();
@@ -126,6 +233,18 @@
       BOOST_TEST(! q.closed());
   }
   {
+    // 1-element queue pull succeed
+      boost::sync_queue<non_copyable> q;
+      non_copyable nc1;
+      q.push(boost::move(nc1));
+      non_copyable nc = q.pull();
+      //BOOST_TEST_EQ(nc, 1);
+      BOOST_TEST(q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 0u);
+      BOOST_TEST(! q.closed());
+  }
+  {
     // 1-element queue try_pull succeed
       boost::sync_queue<int> q;
       q.push(1);
@@ -139,6 +258,19 @@
   }
   {
     // 1-element queue try_pull succeed
+      boost::sync_queue<non_copyable> q;
+      non_copyable nc1;
+      q.push(boost::move(nc1));
+      non_copyable nc;
+      BOOST_TEST(q.try_pull(nc));
+      //BOOST_TEST_EQ(nc, 1);
+      BOOST_TEST(q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 0u);
+      BOOST_TEST(! q.closed());
+  }
+  {
+    // 1-element queue try_pull succeed
       boost::sync_queue<int> q;
       q.push(1);
       int i;
@@ -151,6 +283,19 @@
   }
   {
     // 1-element queue try_pull succeed
+      boost::sync_queue<non_copyable> q;
+      non_copyable nc1;
+      q.push(boost::move(nc1));
+      non_copyable nc;
+      BOOST_TEST(q.try_pull(boost::no_block, nc));
+      //BOOST_TEST_EQ(nc, 1);
+      BOOST_TEST(q.empty());
+      BOOST_TEST(! q.full());
+      BOOST_TEST_EQ(q.size(), 0u);
+      BOOST_TEST(! q.closed());
+  }
+  {
+    // 1-element queue try_pull succeed
       boost::sync_queue<int> q;
       q.push(1);
       boost::shared_ptr<int> i = q.try_pull();