|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r76995 - trunk/boost/thread
From: vicente.botet_at_[hidden]
Date: 2012-02-12 11:44:44
Author: viboes
Date: 2012-02-12 11:44:43 EST (Sun, 12 Feb 2012)
New Revision: 76995
URL: http://svn.boost.org/trac/boost/changeset/76995
Log:
Thread: Move semantics cleanup
Text files modified:
trunk/boost/thread/locks.hpp | 217 ++++++++++++++++++---------------------
1 files changed, 103 insertions(+), 114 deletions(-)
Modified: trunk/boost/thread/locks.hpp
==============================================================================
--- trunk/boost/thread/locks.hpp (original)
+++ trunk/boost/thread/locks.hpp 2012-02-12 11:44:43 EST (Sun, 12 Feb 2012)
@@ -253,15 +253,16 @@
Mutex& m;
#ifndef BOOST_NO_DELETED_FUNCTIONS
+ public:
lock_guard(lock_guard const&) = delete;
lock_guard& operator=(lock_guard const&) = delete;
#else // BOOST_NO_DELETED_FUNCTIONS
- private:
+ private:
lock_guard(lock_guard const&);
lock_guard& operator=(lock_guard const&);
- public:
#endif // BOOST_NO_DELETED_FUNCTIONS
public:
+ typedef Mutex mutex_type;
explicit lock_guard(Mutex& m_):
m(m_)
{
@@ -285,27 +286,20 @@
bool is_locked;
#ifndef BOOST_NO_DELETED_FUNCTIONS
+ public:
unique_lock(unique_lock const&) = delete;
unique_lock& operator=(unique_lock const&) = delete;
#else // BOOST_NO_DELETED_FUNCTIONS
- private:
- // Fixme The following doesn't work
- //test_move_function.cpp:71:12: error: calling a private constructor of class 'boost::unique_lock<boost::mutex>'
- // return boost::unique_lock<boost::mutex>(m);
- //unique_lock(unique_lock const&);
+ private:
unique_lock(unique_lock&);
- // Fixme The following doesn't work
- // ../../../boost/thread/future.hpp:452:33: error: 'operator=' is a private member of 'boost::unique_lock<boost::mutex>'
- // locks[i]=boost::unique_lock<boost::mutex>(futures[i].future->mutex);
- //unique_lock& operator=(unique_lock const&);
unique_lock& operator=(unique_lock &);
- public:
#endif // BOOST_NO_DELETED_FUNCTIONS
private:
explicit unique_lock(upgrade_lock<Mutex>&);
unique_lock& operator=(upgrade_lock<Mutex>& other);
public:
+ typedef Mutex mutex_type;
#if BOOST_WORKAROUND(__SUNPRO_CC, < 0x5100)
unique_lock(const volatile unique_lock&);
#endif
@@ -363,29 +357,20 @@
}
explicit unique_lock(upgrade_lock<Mutex>&& other);
- unique_lock<Mutex>&& move()
- {
- return static_cast<unique_lock<Mutex>&&>(*this);
- }
unique_lock& operator=(unique_lock&& other) BOOST_NOEXCEPT
{
- unique_lock temp(other.move());
+ unique_lock temp(move(other));
swap(temp);
return *this;
}
unique_lock& operator=(upgrade_lock<Mutex>&& other) BOOST_NOEXCEPT
{
- unique_lock temp(other.move());
+ unique_lock temp(move(other));
swap(temp);
return *this;
}
- void swap(unique_lock&& other) BOOST_NOEXCEPT
- {
- std::swap(m,other.m);
- std::swap(is_locked,other.is_locked);
- }
#else
#if defined BOOST_THREAD_USES_MOVE
unique_lock(boost::rv<unique_lock<Mutex> >& other) BOOST_NOEXCEPT:
@@ -638,46 +623,13 @@
friend class upgrade_lock<Mutex>;
};
-#ifndef BOOST_NO_RVALUE_REFERENCES
-// template<typename Mutex>
-// void swap(unique_lock<Mutex>&& lhs,unique_lock<Mutex>&& rhs)
-// {
-// lhs.swap(rhs);
-// }
-
- template<typename Mutex>
- inline upgrade_lock<Mutex>&& move(upgrade_lock<Mutex>&& ul)
- {
- return static_cast<upgrade_lock<Mutex>&&>(ul);
- }
-
- template<typename Mutex>
- inline upgrade_lock<Mutex>&& move(upgrade_lock<Mutex>& ul)
- {
- return static_cast<upgrade_lock<Mutex>&&>(ul);
- }
-#endif
template<typename Mutex>
void swap(unique_lock<Mutex>& lhs,unique_lock<Mutex>& rhs) BOOST_NOEXCEPT
{
lhs.swap(rhs);
}
-#ifndef BOOST_NO_RVALUE_REFERENCES
- template<typename Mutex>
- inline unique_lock<Mutex>&& move(unique_lock<Mutex>&& ul)
- {
- return static_cast<unique_lock<Mutex>&&>(ul);
- }
-
- template<typename Mutex>
- inline unique_lock<Mutex>&& move(unique_lock<Mutex>& ul)
- {
- return static_cast<unique_lock<Mutex>&&>(ul);
- }
-#endif
-
-#ifdef BOOST_NO_RVALUE_REFERENCES
+#if defined BOOST_NO_RVALUE_REFERENCES && ! defined BOOST_THREAD_USES_MOVE
template <typename Mutex>
struct has_move_emulation_enabled_aux<unique_lock<Mutex> >
: BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
@@ -691,15 +643,17 @@
Mutex* m;
bool is_locked;
#ifndef BOOST_NO_DELETED_FUNCTIONS
- shared_lock(shared_lock const&);
- shared_lock& operator=(shared_lock const&);
+ public:
+ shared_lock(shared_lock const&) = delete;
+ shared_lock& operator=(shared_lock const&) = delete;
#else // BOOST_NO_DELETED_FUNCTIONS
- private:
+ private:
shared_lock(shared_lock const&);
shared_lock& operator=(shared_lock const&);
- public:
#endif // BOOST_NO_DELETED_FUNCTIONS
public:
+ typedef Mutex mutex_type;
+
shared_lock():
m(0),is_locked(false)
{}
@@ -726,6 +680,56 @@
timed_lock(target_time);
}
#ifndef BOOST_NO_RVALUE_REFERENCES
+ shared_lock(shared_lock<Mutex> && other):
+ m(other.m),is_locked(other.is_locked)
+ {
+ other.is_locked=false;
+ other.m=0;
+ }
+
+ shared_lock(unique_lock<Mutex> && other):
+ m(other.m),is_locked(other.is_locked)
+ {
+ if(is_locked)
+ {
+ m->unlock_and_lock_shared();
+ }
+ other.is_locked=false;
+ other.m=0;
+ }
+
+ shared_lock(upgrade_lock<Mutex> && other):
+ m(other.m),is_locked(other.is_locked)
+ {
+ if(is_locked)
+ {
+ m->unlock_upgrade_and_lock_shared();
+ }
+ other.is_locked=false;
+ other.m=0;
+ }
+
+
+ shared_lock& operator=(shared_lock<Mutex> && other)
+ {
+ shared_lock temp(other);
+ swap(temp);
+ return *this;
+ }
+
+ shared_lock& operator=(unique_lock<Mutex> && other)
+ {
+ shared_lock temp(other);
+ swap(temp);
+ return *this;
+ }
+
+ shared_lock& operator=(upgrade_lock<Mutex> && other)
+ {
+ shared_lock temp(other);
+ swap(temp);
+ return *this;
+ }
#else
#if defined BOOST_THREAD_USES_MOVE
@@ -853,19 +857,6 @@
#endif
#endif
-#ifndef BOOST_NO_RVALUE_REFERENCES
- void swap(shared_lock&& other)
- {
- std::swap(m,other.m);
- std::swap(is_locked,other.is_locked);
- }
-#else
- void swap(boost::detail::thread_move_t<shared_lock<Mutex> > other)
- {
- std::swap(m,other->m);
- std::swap(is_locked,other->is_locked);
- }
-#endif
void swap(shared_lock& other)
{
std::swap(m,other.m);
@@ -954,7 +945,7 @@
};
-#ifdef BOOST_NO_RVALUE_REFERENCES
+#if defined BOOST_NO_RVALUE_REFERENCES && ! defined BOOST_THREAD_USES_MOVE
template <typename Mutex>
struct has_move_emulation_enabled_aux<shared_lock<Mutex> >
: BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
@@ -962,24 +953,11 @@
#endif
-#ifndef BOOST_NO_RVALUE_REFERENCES
- template<typename Mutex>
- void swap(shared_lock<Mutex>&& lhs,shared_lock<Mutex>&& rhs)
- {
- lhs.swap(rhs);
- }
template<typename Mutex>
void swap(shared_lock<Mutex>& lhs,shared_lock<Mutex>& rhs)
{
lhs.swap(rhs);
}
-#else
- template<typename Mutex>
- void swap(shared_lock<Mutex>& lhs,shared_lock<Mutex>& rhs)
- {
- lhs.swap(rhs);
- }
-#endif
template<typename Mutex>
class upgrade_lock
@@ -987,10 +965,17 @@
protected:
Mutex* m;
bool is_locked;
+#ifndef BOOST_NO_DELETED_FUNCTIONS
+ public:
+ upgrade_lock(upgrade_lock&) = delete;
+ upgrade_lock& operator=(upgrade_lock&) = delete;
+#else
private:
explicit upgrade_lock(upgrade_lock&);
upgrade_lock& operator=(upgrade_lock&);
+#endif
public:
+ typedef Mutex mutex_type;
upgrade_lock():
m(0),is_locked(false)
{}
@@ -1043,6 +1028,7 @@
swap(temp);
return *this;
}
+
#else
#if defined BOOST_THREAD_USES_MOVE
upgrade_lock(boost::rv<upgrade_lock<Mutex> >& other):
@@ -1196,7 +1182,7 @@
friend class unique_lock<Mutex>;
};
-#ifdef BOOST_NO_RVALUE_REFERENCES
+#if defined BOOST_NO_RVALUE_REFERENCES && ! defined BOOST_THREAD_USES_MOVE
template <typename Mutex>
struct has_move_emulation_enabled_aux<upgrade_lock<Mutex> >
: BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
@@ -1247,9 +1233,17 @@
upgrade_lock<Mutex>* source;
unique_lock<Mutex> exclusive;
+#ifndef BOOST_NO_DELETED_FUNCTIONS
+ public:
+ upgrade_to_unique_lock(upgrade_to_unique_lock&) = delete;
+ upgrade_to_unique_lock& operator=(upgrade_to_unique_lock&) = delete;
+#else
+ private:
explicit upgrade_to_unique_lock(upgrade_to_unique_lock&);
upgrade_to_unique_lock& operator=(upgrade_to_unique_lock&);
+#endif
public:
+ typedef Mutex mutex_type;
explicit upgrade_to_unique_lock(upgrade_lock<Mutex>& m_):
source(&m_),exclusive(move(*source))
{}
@@ -1288,6 +1282,14 @@
swap(temp);
return *this;
}
+ operator ::boost::rv<upgrade_to_unique_lock>&()
+ {
+ return *static_cast< ::boost::rv<upgrade_to_unique_lock>* >(this);
+ }
+ operator const ::boost::rv<upgrade_to_unique_lock>&() const
+ {
+ return *static_cast<const ::boost::rv<upgrade_to_unique_lock>* >(this);
+ }
#else
upgrade_to_unique_lock(detail::thread_move_t<upgrade_to_unique_lock<Mutex> > other):
source(other->source),exclusive(move(other->exclusive))
@@ -1301,6 +1303,15 @@
swap(temp);
return *this;
}
+ operator detail::thread_move_t<upgrade_to_unique_lock<Mutex> >()
+ {
+ return move();
+ }
+
+ detail::thread_move_t<upgrade_to_unique_lock<Mutex> > move()
+ {
+ return detail::thread_move_t<upgrade_to_unique_lock<Mutex> >(*this);
+ }
#endif
#endif
void swap(upgrade_to_unique_lock& other)
@@ -1332,7 +1343,7 @@
}
};
-#ifdef BOOST_NO_RVALUE_REFERENCES
+#if defined BOOST_NO_RVALUE_REFERENCES && ! defined BOOST_THREAD_USES_MOVE
template <typename Mutex>
struct has_move_emulation_enabled_aux<upgrade_to_unique_lock<Mutex> >
: BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
@@ -1365,25 +1376,16 @@
{}
#ifndef BOOST_NO_RVALUE_REFERENCES
try_lock_wrapper(try_lock_wrapper&& other):
- base(other.move())
+ base(move(other))
{}
- try_lock_wrapper&& move()
- {
- return static_cast<try_lock_wrapper&&>(*this);
- }
-
try_lock_wrapper& operator=(try_lock_wrapper<Mutex>&& other)
{
- try_lock_wrapper temp(other.move());
+ try_lock_wrapper temp(move(other));
swap(temp);
return *this;
}
- void swap(try_lock_wrapper&& other)
- {
- base::swap(other);
- }
#else
#if defined BOOST_THREAD_USES_MOVE
try_lock_wrapper(boost::rv<try_lock_wrapper<Mutex> >& other):
@@ -1481,24 +1483,11 @@
#endif
};
-#ifndef BOOST_NO_RVALUE_REFERENCES
- template<typename Mutex>
- void swap(try_lock_wrapper<Mutex>&& lhs,try_lock_wrapper<Mutex>&& rhs)
- {
- lhs.swap(rhs);
- }
- template<typename Mutex>
- void swap(try_lock_wrapper<Mutex>& lhs,try_lock_wrapper<Mutex>& rhs)
- {
- lhs.swap(rhs);
- }
-#else
template<typename Mutex>
void swap(try_lock_wrapper<Mutex>& lhs,try_lock_wrapper<Mutex>& rhs)
{
lhs.swap(rhs);
}
-#endif
template<typename MutexType1,typename MutexType2>
unsigned try_lock_internal(MutexType1& m1,MutexType2& m2)
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk