Line data Source code
1 : // Distributed under the Boost Software License, Version 1.0. (See 2 : // accompanying file LICENSE_1_0.txt or copy at 3 : // http://www.boost.org/LICENSE_1_0.txt) 4 : // (C) Copyright 2007 Anthony Williams 5 : // (C) Copyright 2011-2012 Vicente J. Botet Escriba 6 : 7 : #ifndef BOOST_THREAD_LOCK_GUARD_HPP 8 : #define BOOST_THREAD_LOCK_GUARD_HPP 9 : 10 : #include <boost/thread/detail/config.hpp> 11 : #include <boost/thread/detail/delete.hpp> 12 : #include <boost/thread/detail/move.hpp> 13 : #include <boost/thread/detail/lockable_wrapper.hpp> 14 : #include <boost/thread/lock_options.hpp> 15 : #if ! defined BOOST_THREAD_PROVIDES_NESTED_LOCKS 16 : #include <boost/thread/is_locked_by_this_thread.hpp> 17 : #include <boost/assert.hpp> 18 : #endif 19 : 20 : #include <boost/config/abi_prefix.hpp> 21 : 22 : namespace boost 23 : { 24 : 25 : template <typename Mutex> 26 : class BOOST_THREAD_SCOPED_CAPABILITY lock_guard 27 : { 28 : private: 29 : Mutex& m; 30 : 31 : public: 32 : typedef Mutex mutex_type; 33 : BOOST_THREAD_NO_COPYABLE( lock_guard ) 34 : 35 740210 : explicit lock_guard(Mutex& m_) BOOST_THREAD_ACQUIRE(m_) : 36 740210 : m(m_) 37 : { 38 740210 : m.lock(); 39 0 : } 40 : 41 : lock_guard(Mutex& m_, adopt_lock_t) BOOST_THREAD_REQUIRES(m_) : 42 : m(m_) 43 : { 44 : #if ! defined BOOST_THREAD_PROVIDES_NESTED_LOCKS 45 : BOOST_ASSERT(is_locked_by_this_thread(m)); 46 : #endif 47 : } 48 : 49 : #if ! defined BOOST_THREAD_NO_CXX11_HDR_INITIALIZER_LIST 50 : lock_guard(std::initializer_list<thread_detail::lockable_wrapper<Mutex> > l_) : 51 : m(*(const_cast<thread_detail::lockable_wrapper<Mutex>*>(l_.begin())->m)) 52 : { 53 : m.lock(); 54 : } 55 : 56 : lock_guard(std::initializer_list<thread_detail::lockable_adopt_wrapper<Mutex> > l_) : 57 : m(*(const_cast<thread_detail::lockable_adopt_wrapper<Mutex>*>(l_.begin())->m)) 58 : { 59 : #if ! defined BOOST_THREAD_PROVIDES_NESTED_LOCKS 60 : BOOST_ASSERT(is_locked_by_this_thread(m)); 61 : #endif 62 : } 63 : 64 : #endif 65 740210 : ~lock_guard() BOOST_THREAD_RELEASE() 66 : { 67 409596 : m.unlock(); 68 513060 : } 69 : }; 70 : 71 : 72 : #if ! defined BOOST_THREAD_NO_MAKE_LOCK_GUARD 73 : template <typename Lockable> 74 : lock_guard<Lockable> make_lock_guard(Lockable& mtx) 75 : { 76 : return { thread_detail::lockable_wrapper<Lockable>(mtx) }; 77 : } 78 : template <typename Lockable> 79 : lock_guard<Lockable> make_lock_guard(Lockable& mtx, adopt_lock_t) 80 : { 81 : return { thread_detail::lockable_adopt_wrapper<Lockable>(mtx) }; 82 : } 83 : #endif 84 : } 85 : 86 : #include <boost/config/abi_suffix.hpp> 87 : 88 : #endif