$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: anthony_at_[hidden]
Date: 2007-12-04 08:02:59
Author: anthonyw
Date: 2007-12-04 08:02:58 EST (Tue, 04 Dec 2007)
New Revision: 41686
URL: http://svn.boost.org/trac/boost/changeset/41686
Log:
Added test for thread move constructor; implemented move on pthreads
Added:
   trunk/libs/thread/test/test_thread_move.cpp   (contents, props changed)
Text files modified: 
   trunk/boost/thread/pthread/thread.hpp    |     2 +-                                      
   trunk/boost/thread/win32/thread.hpp      |     2 +-                                      
   trunk/libs/thread/src/pthread/thread.cpp |    31 +++++++++++++++++++++++++++++++         
   trunk/libs/thread/src/win32/thread.cpp   |    10 ++++------                              
   trunk/libs/thread/test/Jamfile.v2        |     1 +                                       
   5 files changed, 38 insertions(+), 8 deletions(-)
Modified: trunk/boost/thread/pthread/thread.hpp
==============================================================================
--- trunk/boost/thread/pthread/thread.hpp	(original)
+++ trunk/boost/thread/pthread/thread.hpp	2007-12-04 08:02:58 EST (Tue, 04 Dec 2007)
@@ -133,7 +133,7 @@
             start_thread();
         }
 
-        explicit thread(detail::thread_move_t<thread> x);
+        thread(detail::thread_move_t<thread> x);
         thread& operator=(detail::thread_move_t<thread> x);
         operator detail::thread_move_t<thread>();
         detail::thread_move_t<thread> move();
Modified: trunk/boost/thread/win32/thread.hpp
==============================================================================
--- trunk/boost/thread/win32/thread.hpp	(original)
+++ trunk/boost/thread/win32/thread.hpp	2007-12-04 08:02:58 EST (Tue, 04 Dec 2007)
@@ -200,7 +200,7 @@
             start_thread();
         }
         template <class F>
-        explicit thread(detail::thread_move_t<F> f):
+        thread(detail::thread_move_t<F> f):
             thread_info(detail::heap_new<thread_data<F> >(f))
         {
             start_thread();
Modified: trunk/libs/thread/src/pthread/thread.cpp
==============================================================================
--- trunk/libs/thread/src/pthread/thread.cpp	(original)
+++ trunk/libs/thread/src/pthread/thread.cpp	2007-12-04 08:02:58 EST (Tue, 04 Dec 2007)
@@ -188,6 +188,37 @@
         detach();
     }
 
+    thread::thread(detail::thread_move_t<thread> x)
+    {
+        lock_guard<mutex> lock(x->thread_info_mutex);
+        thread_info=x->thread_info;
+        x->thread_info.reset();
+    }
+    
+    thread& thread::operator=(detail::thread_move_t<thread> x)
+    {
+        thread new_thread(x);
+        swap(new_thread);
+        return *this;
+    }
+        
+    thread::operator detail::thread_move_t<thread>()
+    {
+        return move();
+    }
+
+    detail::thread_move_t<thread> thread::move()
+    {
+        detail::thread_move_t<thread> x(*this);
+        return x;
+    }
+
+    void thread::swap(thread& x)
+    {
+        thread_info.swap(x.thread_info);
+    }
+
+
     bool thread::operator==(const thread& other) const
     {
         return get_id()==other.get_id();
Modified: trunk/libs/thread/src/win32/thread.cpp
==============================================================================
--- trunk/libs/thread/src/win32/thread.cpp	(original)
+++ trunk/libs/thread/src/win32/thread.cpp	2007-12-04 08:02:58 EST (Tue, 04 Dec 2007)
@@ -246,11 +246,9 @@
     
     thread::thread(detail::thread_move_t<thread> x)
     {
-        {
-            boost::mutex::scoped_lock l(x->thread_info_mutex);
-            thread_info=x->thread_info;
-        }
-        x->release_handle();
+        lock_guard<mutex> lock(x->thread_info_mutex);
+        thread_info=x->thread_info;
+        x->thread_info=0;
     }
     
     thread& thread::operator=(detail::thread_move_t<thread> x)
@@ -317,7 +315,7 @@
 
     void thread::release_handle()
     {
-        boost::mutex::scoped_lock l1(thread_info_mutex);
+        lock_guard<mutex> l1(thread_info_mutex);
         thread_info=0;
     }
     
Modified: trunk/libs/thread/test/Jamfile.v2
==============================================================================
--- trunk/libs/thread/test/Jamfile.v2	(original)
+++ trunk/libs/thread/test/Jamfile.v2	2007-12-04 08:02:58 EST (Tue, 04 Dec 2007)
@@ -35,6 +35,7 @@
 {
     test-suite "threads"
         : [ thread-run test_thread.cpp ]
+          [ thread-run test_thread_move.cpp ]
           [ thread-run test_mutex.cpp ]
           [ thread-run test_condition_notify_one.cpp ]
           [ thread-run test_condition_timed_wait_times_out.cpp ]
Added: trunk/libs/thread/test/test_thread_move.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/thread/test/test_thread_move.cpp	2007-12-04 08:02:58 EST (Tue, 04 Dec 2007)
@@ -0,0 +1,37 @@
+// Copyright (C) 2007 Anthony Williams
+//
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying 
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include <boost/thread/thread.hpp>
+#include <boost/test/unit_test.hpp>
+
+void do_nothing()
+{}
+
+void test_move_on_construction()
+{
+    boost::thread x=boost::thread(do_nothing);
+    x.join();
+}
+
+boost::thread make_thread()
+{
+    return boost::thread(do_nothing);
+}
+
+void test_move_from_function_return()
+{
+    boost::thread x=make_thread();
+    x.join();
+}
+
+
+boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[])
+{
+    boost::unit_test_framework::test_suite* test =
+        BOOST_TEST_SUITE("Boost.Threads: thread move test suite");
+
+    test->add(BOOST_TEST_CASE(test_move_on_construction));
+    test->add(BOOST_TEST_CASE(test_move_from_function_return));
+    return test;
+}