File indexing completed on 2025-12-15 10:09:30
0001
0002
0003
0004
0005
0006
0007 #ifndef BOOST_THREAD_LOCK_GUARD_HPP
0008 #define BOOST_THREAD_LOCK_GUARD_HPP
0009
0010 #include <boost/thread/detail/config.hpp>
0011 #include <boost/thread/detail/delete.hpp>
0012 #include <boost/thread/detail/move.hpp>
0013 #include <boost/thread/detail/lockable_wrapper.hpp>
0014 #include <boost/thread/lock_options.hpp>
0015 #if ! defined BOOST_THREAD_PROVIDES_NESTED_LOCKS
0016 #include <boost/thread/is_locked_by_this_thread.hpp>
0017 #include <boost/assert.hpp>
0018 #endif
0019
0020 #include <boost/config/abi_prefix.hpp>
0021
0022 namespace boost
0023 {
0024
0025 template <typename Mutex>
0026 class BOOST_THREAD_SCOPED_CAPABILITY lock_guard
0027 {
0028 private:
0029 Mutex& m;
0030
0031 public:
0032 typedef Mutex mutex_type;
0033 BOOST_THREAD_NO_COPYABLE( lock_guard )
0034
0035 explicit lock_guard(Mutex& m_) BOOST_THREAD_ACQUIRE(m_) :
0036 m(m_)
0037 {
0038 m.lock();
0039 }
0040
0041 lock_guard(Mutex& m_, adopt_lock_t) BOOST_THREAD_REQUIRES(m_) :
0042 m(m_)
0043 {
0044 #if ! defined BOOST_THREAD_PROVIDES_NESTED_LOCKS
0045 BOOST_ASSERT(is_locked_by_this_thread(m));
0046 #endif
0047 }
0048
0049 #if ! defined BOOST_THREAD_NO_CXX11_HDR_INITIALIZER_LIST
0050 lock_guard(std::initializer_list<thread_detail::lockable_wrapper<Mutex> > l_) :
0051 m(*(const_cast<thread_detail::lockable_wrapper<Mutex>*>(l_.begin())->m))
0052 {
0053 m.lock();
0054 }
0055
0056 lock_guard(std::initializer_list<thread_detail::lockable_adopt_wrapper<Mutex> > l_) :
0057 m(*(const_cast<thread_detail::lockable_adopt_wrapper<Mutex>*>(l_.begin())->m))
0058 {
0059 #if ! defined BOOST_THREAD_PROVIDES_NESTED_LOCKS
0060 BOOST_ASSERT(is_locked_by_this_thread(m));
0061 #endif
0062 }
0063
0064 #endif
0065 ~lock_guard() BOOST_THREAD_RELEASE()
0066 {
0067 m.unlock();
0068 }
0069 };
0070
0071
0072 #if ! defined BOOST_THREAD_NO_MAKE_LOCK_GUARD
0073 template <typename Lockable>
0074 lock_guard<Lockable> make_lock_guard(Lockable& mtx)
0075 {
0076 return { thread_detail::lockable_wrapper<Lockable>(mtx) };
0077 }
0078 template <typename Lockable>
0079 lock_guard<Lockable> make_lock_guard(Lockable& mtx, adopt_lock_t)
0080 {
0081 return { thread_detail::lockable_adopt_wrapper<Lockable>(mtx) };
0082 }
0083 #endif
0084 }
0085
0086 #include <boost/config/abi_suffix.hpp>
0087
0088 #endif