Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-15 10:09:30

0001 // Distributed under the Boost Software License, Version 1.0. (See
0002 // accompanying file LICENSE_1_0.txt or copy at
0003 // http://www.boost.org/LICENSE_1_0.txt)
0004 // (C) Copyright 2007 Anthony Williams
0005 // (C) Copyright 2011-2012 Vicente J. Botet Escriba
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