diff --git a/include/boost/fiber/bounded_channel.hpp b/include/boost/fiber/bounded_channel.hpp index 3d926339..ed750618 100644 --- a/include/boost/fiber/bounded_channel.hpp +++ b/include/boost/fiber/bounded_channel.hpp @@ -174,7 +174,7 @@ private: ++count_; } - value_type & value_pop_() { + value_type value_pop_() { BOOST_ASSERT( ! is_empty_() ); try { @@ -188,7 +188,7 @@ private: not_full_cond_.notify_all(); } } - return old_head->va; + return std::move( old_head->va); } catch (...) { close_(); throw; @@ -350,7 +350,7 @@ public: return channel_op_status::closed; } - std::swap( va, value_pop_() ); + va = value_pop_(); return channel_op_status::success; } @@ -385,7 +385,7 @@ public: return channel_op_status::empty; } - std::swap( va, value_pop_() ); + va = value_pop_(); return channel_op_status::success; } @@ -411,7 +411,7 @@ public: return channel_op_status::closed; } - std::swap( va, value_pop_() ); + va = value_pop_(); return channel_op_status::success; } }; diff --git a/include/boost/fiber/unbounded_channel.hpp b/include/boost/fiber/unbounded_channel.hpp index 8fead881..0fbe3e75 100644 --- a/include/boost/fiber/unbounded_channel.hpp +++ b/include/boost/fiber/unbounded_channel.hpp @@ -128,12 +128,12 @@ private: tail_ = & new_node->nxt; } - value_type & value_pop_() { + value_type value_pop_() { BOOST_ASSERT( ! is_empty_() ); try { typename node::ptr old_head = pop_head_(); - return old_head->va; + return std::move( old_head->va); } catch (...) { close_(); throw; @@ -206,7 +206,7 @@ public: return channel_op_status::closed; } - std::swap( va, value_pop_() ); + va = value_pop_(); return channel_op_status::success; } @@ -241,7 +241,7 @@ public: return channel_op_status::empty; } - std::swap( va, value_pop_() ); + va = value_pop_(); return channel_op_status::success; } @@ -265,7 +265,7 @@ public: return channel_op_status::closed; } - std::swap( va, value_pop_() ); + va = value_pop_(); return channel_op_status::success; } }; diff --git a/test/test_bounded_channel.cpp b/test/test_bounded_channel.cpp index 3eda0594..a78d39a3 100644 --- a/test/test_bounded_channel.cpp +++ b/test/test_bounded_channel.cpp @@ -785,13 +785,16 @@ void test_moveable() BOOST_CHECK( c.is_empty() ); moveable m1( 3), m2; BOOST_CHECK( m1.state); + BOOST_CHECK_EQUAL( 3, m1.value); BOOST_CHECK( ! m2.state); + BOOST_CHECK_EQUAL( -1, m2.value); BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( std::move( m1) ) ); BOOST_CHECK( ! m1.state); BOOST_CHECK( ! m2.state); BOOST_CHECK( ! c.is_empty() ); BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop( m2) ); BOOST_CHECK( ! m1.state); + BOOST_CHECK_EQUAL( -1, m1.value); BOOST_CHECK( m2.state); BOOST_CHECK_EQUAL( 3, m2.value); BOOST_CHECK( c.is_empty() ); diff --git a/test/test_unbounded_channel.cpp b/test/test_unbounded_channel.cpp index 80cfa574..bb64403f 100644 --- a/test/test_unbounded_channel.cpp +++ b/test/test_unbounded_channel.cpp @@ -344,13 +344,16 @@ void test_moveable() BOOST_CHECK( c.is_empty() ); moveable m1( 3), m2; BOOST_CHECK( m1.state); + BOOST_CHECK_EQUAL( 3, m1.value); BOOST_CHECK( ! m2.state); + BOOST_CHECK_EQUAL( -1, m2.value); BOOST_CHECK( boost::fibers::channel_op_status::success == c.push( std::move( m1) ) ); BOOST_CHECK( ! m1.state); BOOST_CHECK( ! m2.state); BOOST_CHECK( ! c.is_empty() ); BOOST_CHECK( boost::fibers::channel_op_status::success == c.pop( m2) ); BOOST_CHECK( ! m1.state); + BOOST_CHECK_EQUAL( -1, m1.value); BOOST_CHECK( m2.state); BOOST_CHECK_EQUAL( 3, m2.value); BOOST_CHECK( c.is_empty() );