| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- // 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
|