| // 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) |
| // (C) Copyright 2007 Anthony Williams |
| // (C) Copyright 2011-2012 Vicente J. Botet Escriba |
| |
| #ifndef BOOST_THREAD_LOCK_GUARD_HPP |
| #define BOOST_THREAD_LOCK_GUARD_HPP |
| |
| #include <boost/thread/detail/config.hpp> |
| #include <boost/thread/detail/delete.hpp> |
| #include <boost/thread/detail/move.hpp> |
| #include <boost/thread/detail/lockable_wrapper.hpp> |
| #include <boost/thread/lock_options.hpp> |
| #if ! defined BOOST_THREAD_PROVIDES_NESTED_LOCKS |
| #include <boost/thread/is_locked_by_this_thread.hpp> |
| #include <boost/assert.hpp> |
| #endif |
| |
| #include <boost/config/abi_prefix.hpp> |
| |
| namespace boost |
| { |
| |
| template <typename Mutex> |
| class BOOST_THREAD_SCOPED_CAPABILITY lock_guard |
| { |
| private: |
| Mutex& m; |
| |
| public: |
| typedef Mutex mutex_type; |
| BOOST_THREAD_NO_COPYABLE( lock_guard ) |
| |
| explicit lock_guard(Mutex& m_) BOOST_THREAD_ACQUIRE(m_) : |
| m(m_) |
| { |
| m.lock(); |
| } |
| |
| lock_guard(Mutex& m_, adopt_lock_t) BOOST_THREAD_REQUIRES(m_) : |
| m(m_) |
| { |
| #if ! defined BOOST_THREAD_PROVIDES_NESTED_LOCKS |
| BOOST_ASSERT(is_locked_by_this_thread(m)); |
| #endif |
| } |
| |
| #if ! defined BOOST_THREAD_NO_CXX11_HDR_INITIALIZER_LIST |
| lock_guard(std::initializer_list<thread_detail::lockable_wrapper<Mutex> > l_) : |
| m(*(const_cast<thread_detail::lockable_wrapper<Mutex>*>(l_.begin())->m)) |
| { |
| m.lock(); |
| } |
| |
| lock_guard(std::initializer_list<thread_detail::lockable_adopt_wrapper<Mutex> > l_) : |
| m(*(const_cast<thread_detail::lockable_adopt_wrapper<Mutex>*>(l_.begin())->m)) |
| { |
| #if ! defined BOOST_THREAD_PROVIDES_NESTED_LOCKS |
| BOOST_ASSERT(is_locked_by_this_thread(m)); |
| #endif |
| } |
| |
| #endif |
| ~lock_guard() BOOST_THREAD_RELEASE() |
| { |
| m.unlock(); |
| } |
| }; |
| |
| |
| #if ! defined BOOST_THREAD_NO_MAKE_LOCK_GUARD |
| template <typename Lockable> |
| lock_guard<Lockable> make_lock_guard(Lockable& mtx) |
| { |
| return { thread_detail::lockable_wrapper<Lockable>(mtx) }; |
| } |
| template <typename Lockable> |
| lock_guard<Lockable> make_lock_guard(Lockable& mtx, adopt_lock_t) |
| { |
| return { thread_detail::lockable_adopt_wrapper<Lockable>(mtx) }; |
| } |
| #endif |
| } |
| |
| #include <boost/config/abi_suffix.hpp> |
| |
| #endif |