mirror of
https://github.com/boostorg/thread.git
synced 2026-02-11 12:12:12 +00:00
merged from trunk
[SVN r45230]
This commit is contained in:
@@ -53,5 +53,7 @@ rule thread-run ( sources )
|
||||
[ thread-run test_shared_mutex_part_2.cpp ]
|
||||
[ thread-run test_shared_mutex_timed_locks.cpp ]
|
||||
[ thread-run test_lock_concept.cpp ]
|
||||
[ compile-fail no_implicit_move_from_lvalue_thread.cpp ]
|
||||
[ compile-fail no_implicit_assign_from_lvalue_thread.cpp ]
|
||||
;
|
||||
}
|
||||
|
||||
15
test/no_implicit_assign_from_lvalue_thread.cpp
Normal file
15
test/no_implicit_assign_from_lvalue_thread.cpp
Normal file
@@ -0,0 +1,15 @@
|
||||
// Copyright (C) 2008 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>
|
||||
|
||||
void do_nothing()
|
||||
{}
|
||||
|
||||
void test()
|
||||
{
|
||||
boost::thread t1(do_nothing);
|
||||
boost::thread t2;
|
||||
t2=t1;
|
||||
}
|
||||
14
test/no_implicit_move_from_lvalue_thread.cpp
Normal file
14
test/no_implicit_move_from_lvalue_thread.cpp
Normal file
@@ -0,0 +1,14 @@
|
||||
// Copyright (C) 2008 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>
|
||||
|
||||
void do_nothing()
|
||||
{}
|
||||
|
||||
void test()
|
||||
{
|
||||
boost::thread t1(do_nothing);
|
||||
boost::thread t2(t1);
|
||||
}
|
||||
@@ -185,11 +185,22 @@ struct test_throws_if_unlock_called_when_already_unlocked
|
||||
BOOST_CHECK_THROW( lock.unlock(), boost::lock_error );
|
||||
}
|
||||
};
|
||||
template<typename Lock>
|
||||
struct test_default_constructed_has_no_mutex_and_unlocked
|
||||
{
|
||||
void operator()() const
|
||||
{
|
||||
Lock l;
|
||||
BOOST_CHECK(!l.mutex());
|
||||
BOOST_CHECK(!l.owns_lock());
|
||||
};
|
||||
};
|
||||
|
||||
BOOST_TEST_CASE_TEMPLATE_FUNCTION(test_scoped_lock_concept,Mutex)
|
||||
{
|
||||
typedef typename Mutex::scoped_lock Lock;
|
||||
|
||||
test_default_constructed_has_no_mutex_and_unlocked<Lock>()();
|
||||
test_initially_locked<Mutex,Lock>()();
|
||||
test_initially_unlocked_with_defer_lock_parameter<Mutex,Lock>()();
|
||||
test_initially_locked_with_adopt_lock_parameter<Mutex,Lock>()();
|
||||
@@ -203,6 +214,7 @@ BOOST_TEST_CASE_TEMPLATE_FUNCTION(test_scoped_try_lock_concept,Mutex)
|
||||
{
|
||||
typedef typename Mutex::scoped_try_lock Lock;
|
||||
|
||||
test_default_constructed_has_no_mutex_and_unlocked<Lock>()();
|
||||
test_initially_locked<Mutex,Lock>()();
|
||||
test_initially_unlocked_if_other_thread_has_lock<Mutex,Lock>()();
|
||||
test_initially_unlocked_with_defer_lock_parameter<Mutex,Lock>()();
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
// Copyright (C) 2007 Anthony Williams
|
||||
// Copyright (C) 2007-8 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>
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
void do_nothing()
|
||||
{}
|
||||
@@ -20,13 +21,36 @@ void test_thread_move_from_lvalue_on_construction()
|
||||
dest.join();
|
||||
}
|
||||
|
||||
void test_thread_move_from_lvalue_on_assignment()
|
||||
{
|
||||
boost::thread src(do_nothing);
|
||||
boost::thread::id src_id=src.get_id();
|
||||
boost::thread dest;
|
||||
dest=boost::move(src);
|
||||
boost::thread::id dest_id=dest.get_id();
|
||||
BOOST_CHECK(src_id==dest_id);
|
||||
BOOST_CHECK(src.get_id()==boost::thread::id());
|
||||
dest.join();
|
||||
}
|
||||
|
||||
boost::thread start_thread()
|
||||
{
|
||||
return boost::thread(do_nothing);
|
||||
}
|
||||
|
||||
void test_thread_move_from_rvalue_on_construction()
|
||||
{
|
||||
boost::thread x(boost::move(boost::thread(do_nothing)));
|
||||
boost::thread x(start_thread());
|
||||
BOOST_CHECK(x.get_id()!=boost::thread::id());
|
||||
x.join();
|
||||
}
|
||||
|
||||
void test_thread_move_from_rvalue_using_explicit_move()
|
||||
{
|
||||
boost::thread x(boost::move(start_thread()));
|
||||
BOOST_CHECK(x.get_id()!=boost::thread::id());
|
||||
x.join();
|
||||
}
|
||||
|
||||
void test_unique_lock_move_from_lvalue_on_construction()
|
||||
{
|
||||
@@ -42,6 +66,48 @@ void test_unique_lock_move_from_lvalue_on_construction()
|
||||
BOOST_CHECK(l2.mutex()==&m);
|
||||
}
|
||||
|
||||
boost::unique_lock<boost::mutex> get_lock(boost::mutex& m)
|
||||
{
|
||||
return boost::unique_lock<boost::mutex>(m);
|
||||
}
|
||||
|
||||
|
||||
void test_unique_lock_move_from_rvalue_on_construction()
|
||||
{
|
||||
boost::mutex m;
|
||||
boost::unique_lock<boost::mutex> l(get_lock(m));
|
||||
BOOST_CHECK(l.owns_lock());
|
||||
BOOST_CHECK(l.mutex()==&m);
|
||||
}
|
||||
|
||||
namespace user
|
||||
{
|
||||
template<typename T>
|
||||
T move(T& t)
|
||||
{
|
||||
return t.move();
|
||||
}
|
||||
|
||||
bool move_called=false;
|
||||
|
||||
struct nc:
|
||||
public boost::shared_ptr<int>
|
||||
{
|
||||
nc move()
|
||||
{
|
||||
move_called=true;
|
||||
return nc();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
void test_move_for_user_defined_type_unaffected()
|
||||
{
|
||||
user::nc src;
|
||||
user::nc dest=move(src);
|
||||
BOOST_CHECK(user::move_called);
|
||||
}
|
||||
|
||||
boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[])
|
||||
{
|
||||
boost::unit_test_framework::test_suite* test =
|
||||
@@ -49,6 +115,10 @@ boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[])
|
||||
|
||||
test->add(BOOST_TEST_CASE(test_thread_move_from_lvalue_on_construction));
|
||||
test->add(BOOST_TEST_CASE(test_thread_move_from_rvalue_on_construction));
|
||||
test->add(BOOST_TEST_CASE(test_thread_move_from_rvalue_using_explicit_move));
|
||||
test->add(BOOST_TEST_CASE(test_thread_move_from_lvalue_on_assignment));
|
||||
test->add(BOOST_TEST_CASE(test_unique_lock_move_from_lvalue_on_construction));
|
||||
test->add(BOOST_TEST_CASE(test_unique_lock_move_from_rvalue_on_construction));
|
||||
test->add(BOOST_TEST_CASE(test_move_for_user_defined_type_unaffected));
|
||||
return test;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user